Redshift SQL查询:统计各市场数量桶内的组织数量需求咨询
Redshift SQL 实现组织覆盖市场数量的分组统计
完整查询语句
WITH org_market_count AS ( -- 计算每个组织覆盖的唯一市场数量 SELECT organization_id, COUNT(DISTINCT market_name) AS market_count FROM organization_facts -- 若需筛选企业账户,取消下方注释 -- WHERE enterprise_account = true GROUP BY organization_id ), market_buckets AS ( -- 生成1到50的市场数量桶序列 SELECT generate_series(1, 50) AS bucket ) -- 关联统计结果,补全所有桶的组织数量(含0值) SELECT CONCAT(b.bucket, '个市场') AS "市场数量桶", COALESCE(COUNT(o.organization_id), 0) AS "组织数量" FROM market_buckets b LEFT JOIN org_market_count o ON b.bucket = o.market_count GROUP BY b.bucket ORDER BY b.bucket;
代码解释
org_market_count CTE
- 按
organization_id分组,通过COUNT(DISTINCT market_name)计算每个组织实际覆盖的唯一市场数,避免同组织同市场的重复记录干扰统计。 - 如需仅统计企业账户,取消
WHERE子句的注释即可。
- 按
market_buckets CTE
- 利用Redshift的
generate_series函数生成1到50的连续数字,确保所有需要统计的市场数量桶都被包含,即使某桶没有对应组织也能显示0值。
- 利用Redshift的
最终查询
- 通过左连接保留所有市场数量桶,用
COALESCE将NULL转换为0,明确表示该桶下无对应组织。 - 用
CONCAT将数字格式化为“X个市场”的文本,匹配你期望的输出格式。
- 通过左连接保留所有市场数量桶,用
示例数据验证
基于你提供的示例数据,执行查询后会得到如下核心结果:
| 市场数量桶 | 组织数量 |
|---|---|
| 1个市场 | 3 |
| 2个市场 | 1 |
| 3个市场 | 0 |
| ... | ... |
| 50个市场 | 0 |
其中:
- Company x(ID15683)覆盖纽约、双子城2个市场
- Company y、Company z、Company xy各覆盖1个市场
完全符合你期望的统计逻辑。
原SQL问题说明
你原有的SQL仅尝试处理“1个市场”的单一场景,未实现通用分组统计,也未处理同组织多市场记录的去重问题,更无法覆盖1-50所有市场数量桶的展示需求。上述查询完整解决了这些问题,适配超10000家公司的批量统计场景。
内容的提问来源于stack exchange,提问作者Yiga Ngbogbara
相关产品推荐
相关产品推荐

