我有一张表,我要在其中提取两列的唯一组合并按其他列分组。
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分钟。
答案 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]