如何编写SQL查询:保留所有行并计算每个event_id的唯一payor数
解决SQL中按event_id统计唯一payor数量并保留所有行的问题
表结构
原表创建语句修正后如下:
create table tbl ( event_id integer, payor varchar );
其中event_id与payor字段均存在重复值,单个event_id可对应多个不同payor。
需求说明
查询结果需保留原表的event_id、payor列,新增一列显示对应event_id的唯一payor数量,且必须保留表中所有行。
示例结果
| event_id | payor | count | 计数说明 |
|---|---|---|---|
| 2323 | a | 2 | 计数为2,因为2323有2个唯一payor:a和b |
| 2323 | b | 2 | 计数为2,因为2323有2个唯一payor:a和b |
| 5432 | b | 1 | 计数为1,因为5432有1个唯一payor:b |
| 3423 | c | 1 | 计数为1,因为3423有1个唯一payor:c |
| 211 | y | 1 | 计数为1,因为211有1个唯一payor:y |
| 211 | y | 1 | 计数为1,因为211有1个唯一payor:y |
| 600 | t | 2 | 计数为2,因为600有2个唯一payor:t、o |
| 600 | o | 2 | 计数为2,因为600有2个唯一payor:t、o |
| 600 | t | 2 | 计数为2,因为600有2个唯一payor:t、o |
尝试的错误SQL
用户尝试的语句逻辑混乱,无法实现需求:
select event_id, payor, (count(event_id) over(partition by event_id order by event_id) filter (where (count(payor) over(partition by event_id order by event_id)) >2)) from tbl
正确SQL语句
方法一:窗口函数(兼容支持count(distinct)窗口函数的数据库)
适用于PostgreSQL、SQL Server 2019+、MySQL 8.0.19+等数据库,直接通过窗口函数分组统计每个event_id的唯一payor数量:
select event_id, payor, count(distinct payor) over(partition by event_id) as count from tbl;
方法二:子查询关联(兼容所有SQL数据库)
如果使用的数据库不支持窗口函数中使用count(distinct),可以先通过子查询统计每个event_id的唯一payor数,再与原表关联,确保保留所有行:
select t.event_id, t.payor, p.unique_payor_count as count from tbl t inner join ( select event_id, count(distinct payor) as unique_payor_count from tbl group by event_id ) p on t.event_id = p.event_id;
内容的提问来源于stack exchange,提问作者Rahul Dev vasisht
相关产品推荐
相关产品推荐

