首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >选择distinct two columns并应用group by other columns

选择distinct two columns并应用group by other columns
EN

Stack Overflow用户
提问于 2018-07-26 13:47:02
回答 3查看 1.3K关注 0票数 0

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

代码语言:javascript
复制
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的唯一组合的数量。预期结果如下

代码语言:javascript
复制
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,但由于表有数十亿行,它占用的时间太长。

代码语言:javascript
复制
  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分钟。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

票数 1
EN

Stack Overflow用户

发布于 2018-07-26 18:50:20

我认为Redshift没有有效地实现count(distinct),因为它序列化了不同的计数。这意味着最好将子查询与select distinct一起使用

代码语言:javascript
复制
select start_date, version, count(*)
from (select distinct userid, itemid, version, start_date
      from table name
     ) t
group by start_date, version;
票数 1
EN

Stack Overflow用户

发布于 2018-07-26 16:21:25

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

代码语言:javascript
复制
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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51531786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档