【问题标题】:Select unique from two columns with group by使用 group by 从两列中选择唯一的
【发布时间】:2020-12-02 15:13:15
【问题描述】:

我有一张桌子:

CREATE TABLE stats_test
(
  id1 bigint,
  id2 bigint,
  date timestamp with time zone
);    

还有里面的数据:

 id1 | id2 |          date
-----+-----+------------------------
   1 |   2 | 2020-12-01 00:00:00+00
   2 |   1 | 2020-12-01 00:00:00+00
   3 |   4 | 2020-11-01 00:00:00+00
   4 |   3 | 2020-11-01 00:00:00+00
   1 |   3 | 2020-12-01 00:00:00+00
   1 |   3 | 2020-11-01 00:00:00+00

通过这个查询,我得到了结果:

SELECT EXTRACT(YEAR FROM date), EXTRACT(MONTH FROM date), 
COUNT(DISTINCT id1) AS unique_id1, COUNT(DISTINCT id2) AS unique_id2 
FROM stats_test GROUP BY EXTRACT(YEAR FROM date), EXTRACT(MONTH FROM date);

 date_part | date_part | unique_id1 | unique_id2
-----------+-----------+------------+------------
      2020 |        11 |          3 |          2
      2020 |        12 |          2 |          3

如何从按年和月分组的两列 (id1, id2) 的集合中获取具有计数唯一 ID 的另一列?

 date_part | date_part | unique_id1 | unique_id2 | unique_both_ids
-----------+-----------+------------+------------+----------------
      2020 |        11 |          3 |          2 |
      2020 |        12 |          2 |          3 |    

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    count(distinct ..) 只允许单个表达式(因此count(distinct id1,id2) 被拒绝),但您可以使用匿名行表达式来克服该限制:

    select extract(year from date) as year, 
           extract(month from date) as month,
           count(distinct id1) as unique_id1, 
           count(distinct id2) as unique_id2,
           count(distinct (id1,id2)) as unique_both_ids
    from stats_test 
    group by extract(year from date), extract(month from date);
    

    请注意,1,2 和 2,1 将被视为两个不同的东西。如果您希望它们受到相同的对待,请使用:count(distinct (least(id1,id2), greatest(id1,id2)))

    【讨论】:

    • 但是,我不确定它是否按我想要的方式工作。因为我英文不好,写的不好。我的意思是从对 ids (1,2),(2,1),(3,1),(1,3),(4,1),(4,3),(3,4), (3,2) 以此类推,COUNT = 4。因为在所有这些组合中都有四个唯一 id
    猜你喜欢
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多