PostgreSQL中分组数据计算B/(B+C)比率的SQL实现
PostgreSQL 按季度分组计算指定分类占比方案
核心逻辑说明
- 聚合维度:以季度字段
QY为单位做聚合统计 - 计算公式:季度比率 = 同季度下
Column2='B'的计数值 /(同季度下Column2='B'计数值 +Column2='C'计数值) - 边界处理:加入除零保护,避免某季度无B、C类数据时脚本报错
实现脚本
假设你存储已聚合数据的表名为agg_table,执行时替换为实际表名即可:
SELECT QY, ROUND( SUM(CASE WHEN Column2 = 'B' THEN Count ELSE 0 END)::NUMERIC / NULLIF(SUM(CASE WHEN Column2 IN ('B', 'C') THEN Count ELSE 0 END), 0), 4 ) AS b_ratio FROM agg_table WHERE Column2 IN ('B', 'C') GROUP BY QY ORDER BY QY;
针对提供的样例数据,执行后返回结果:
| QY | b_ratio |
|---|---|
| 1-2021 | 0.4000 |
| 2-2021 | 0.4286 |
扩展场景:保留所有原始行同时附带季度比率
如果需要保留Column2='A'的原始行,且每行都展示对应季度的计算比率,可以使用窗口函数实现,不需要提前过滤数据:
SELECT QY, Column2, Count, ROUND( MAX(CASE WHEN Column2 = 'B' THEN Count ELSE 0 END) OVER (PARTITION BY QY)::NUMERIC / NULLIF(SUM(CASE WHEN Column2 IN ('B', 'C') THEN Count ELSE 0 END) OVER (PARTITION BY QY), 0), 4 ) AS quarter_b_ratio FROM agg_table ORDER BY QY, Column2;
内容的提问来源于stack exchange,提问作者Nelli
相关产品推荐
相关产品推荐

