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

如何用Partition By实现单列双值的SQL数据统计与透视表生成

按多字段分组统计不同event_name行数的解决方案

原始数据表

stream_idevent_dateevent_namepromo_nameslot
12301012222selectbananaA1
12301012222selectbananaA2
12301012222selectbananaA3
12301012222selectbananaA3
12301012222selectbananaA3
12301012222viewbananaA1
12301012222viewbananaA1
12301012222viewbananaA2
12301012222viewbananaA3
12301012222viewbananaA4

目标透视表

stream_idevent_datepromo_nameslotevent_name_select_countevent_name_view_count
12301012222bananaA112
12301012222bananaA211
12301012222bananaA331
12301012222bananaA401

尝试过的SQL

SELECT
    stream_id, event_date, event_name, promo_name, slot, 
COUNT(event_name) OVER (PARTITION BY stream_id,event_date, promo_name, slot) AS event_name_count 
FROM `TABLE`

可行SQL方案

方案一:条件聚合(推荐)

直接使用GROUP BY结合CASE WHEN实现条件统计,逻辑清晰且高效:

SELECT
    stream_id,
    event_date,
    promo_name,
    slot,
    COUNT(CASE WHEN event_name = 'select' THEN 1 END) AS event_name_select_count,
    COUNT(CASE WHEN event_name = 'view' THEN 1 END) AS event_name_view_count
FROM `TABLE`
GROUP BY stream_id, event_date, promo_name, slot
ORDER BY slot;
  • CASE WHEN会针对每行判断event_name值,符合条件返回1,否则返回NULL;COUNT函数自动忽略NULL,从而得到对应event_name的行数
  • 分组字段确保每个结果行对应唯一的stream_id+event_date+promo_name+slot组合
  • 无对应event_name的分组会自动返回0,满足需求

方案二:窗口函数+去重

如果偏好窗口函数写法,可通过窗口函数统计后去重:

SELECT DISTINCT
    stream_id,
    event_date,
    promo_name,
    slot,
    COUNT(CASE WHEN event_name = 'select' THEN 1 END) OVER (PARTITION BY stream_id, event_date, promo_name, slot) AS event_name_select_count,
    COUNT(CASE WHEN event_name = 'view' THEN 1 END) OVER (PARTITION BY stream_id, event_date, promo_name, slot) AS event_name_view_count
FROM `TABLE`
ORDER BY slot;

窗口函数对每个分组计算统计值,再通过DISTINCT去除重复行,最终得到目标结果。

内容的提问来源于stack exchange,提问作者tarik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:14:59