我有一个表,我想在其中提取两列的唯一组合,并按其他列分组。
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
我知道如何找到多列的不同组合,但在group by中遇到问题。
我尝试在version和start_date上应用userid和itemid的连接的count distinct和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是排序键。找到不同的userid大约需要6分钟,当我应用group by version大约需要13-14分钟。
发布于 2018-07-29 01:42:26
选择
count(*),version,start_date from ( Select userid,itemid,version,start_date,Row_number() over() over(partition by userid,itemid order by itemid asc ) rnk from stack_check )a group by version,start_date order by start_date
窗口函数将帮助您获得您正在寻找的东西。
https://docs.aws.amazon.com/redshift/latest/dg/c_Window_functions.html
发布于 2018-07-26 18:50:20
我认为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;
发布于 2018-07-26 16:21:25
尝试使用子查询来获取不同的列,然后连接计数:
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]
https://stackoverflow.com/questions/51531786
复制相似问题