You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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_idpayorcount计数说明
2323a2计数为2,因为2323有2个唯一payor:a和b
2323b2计数为2,因为2323有2个唯一payor:a和b
5432b1计数为1,因为5432有1个唯一payor:b
3423c1计数为1,因为3423有1个唯一payor:c
211y1计数为1,因为211有1个唯一payor:y
211y1计数为1,因为211有1个唯一payor:y
600t2计数为2,因为600有2个唯一payor:t、o
600o2计数为2,因为600有2个唯一payor:t、o
600t2计数为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:40:45