sql - 使用 group by 从两列中选择唯一的
问题描述
我有一张桌子:
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 |
解决方案
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)))
推荐阅读
- sql - 需要在我的表的某些列中插入空值
- python - 如何从屏幕中提取选定的矩形作为顶视图图像?
- perl - 如何使用 perl 按顺序获取匹配项
- visual-studio - Xamarin.Forms 新项目创建有无数错误。nuget有什么问题吗?
- java - Windows 上的命令行程序随机冻结。Ctrl-C 重新激活它们
- python - 队列实现显示功能错误
- qt - QCombobox 不使用自定义委托来呈现当前项目
- python - Selenium-在循环的第二次迭代期间无法找到元素[Python]
- php - 如何使用 fetch 从 db 创建的数组创建一个数组?
- javascript - 如何使用 Webpack 通过 React 加载具有相对路径的静态文件?