选择不同的两列,然后按其他列进行分组

时间:2018-07-26 05:47:02

标签: sql amazon-redshift

我有一张表,我要在其中提取两列的唯一组合并按其他列分组。

userid   itemid   version   start_date
uid1     itemid1  version1  2018-07-25 00:00:00
uid1     itemid2  version1  2018-07-25 00:00:00
uid1     itemid1  version2  2018-07-25 00:00:00
uid2     itemid3  version1  2018-07-26 00:00:00
uid2     itemid4  version1  2018-07-26 00:00:00
uid2     itemid2  version1  2018-07-26 00:00:00
uid2     itemid2  version2  2018-07-26 00:00:00

我想按版本和start_date找出userid和itemid组的唯一组合数。预期结果如下

total     version    start_date
2         version1   2018-07-25 00:00:00
1         version2   2018-07-25 00:00:00
3         version1   2018-07-26 00:00:00
1         version2   2018-07-26 00:00:00

我知道如何找到多个列的独特组合,但是在分组依据中却遇到了问题。

我尝试在版本和start_date上应用userid和itemid的连接数以及group by的区别计数,但是由于表有数十亿行,这花费了太多时间。

  select start_date, count(distinct(userid || '_' || itemid)), version
  from table name
  group by start_date, version;

@Jon推荐

预计持续时间不会超过一个小时。我正在使用15个DS2实例类型的节点(我也有其他数据表)。 start_date是Dist键,itemid,userid,version是排序键。按版本应用分组需要大约6分钟的时间才能找到与众不同的用户ID,大约需要13-14分钟。

3 个答案:

答案 0 :(得分:1)

我相信Redshift不能有效实现count(distinct),因为它会序列化唯一计数。这意味着最好将子查询与select distinct一起使用:

select start_date, version, count(*)
from (select distinct userid, itemid, version, start_date
      from table name
     ) t
group by start_date, version;

答案 1 :(得分:1)

选择
计数(*), 版, 从( 选择 用户身份, itemid, 版, 开始日期, Row_number()over(按用户ID划分,按ID排序,按ID升序排列)rnk 从stack_check ) 一种 通过...分组 版, 开始日期 在start_date之前订购

窗口功能将帮助您获得所需的信息。

https://docs.aws.amazon.com/redshift/latest/dg/c_Window_functions.html

答案 2 :(得分:0)

尝试使用子查询获取不同的列,然后使用连接进行计数:

SELECT
COUNT(T2.itemID) AS total
,T1.[version]
,T1.[start_date]


FROM
    (
        SELECT DISTINCT
        itemid
        ,[version]
        ,[start_date]

        FROM
        YourTable
    ) AS T1
LEFT OUTER JOIN
YourTable T2
ON T1.itemid = t2.itemid
    AND T1.[version] = T2.[version]
    AND T1.[start_date] = T2.[start_date]

GROUP BY
T1.[version]
,T1.[start_date]