保留全列时计算count(distinct group)及拆分blocks的实现疑问
数据表分组均分字段解决方案
示例输入输出
假设原表结构及数据如下(除group列外,同CODE的其他列值完全一致):
输入表
| CODE | total_blocks | group | other_cols |
|---|---|---|---|
| A | 12 | G1 | val1 |
| A | 12 | G2 | val1 |
| A | 12 | G3 | val1 |
| B | 8 | G4 | val2 |
| B | 8 | G5 | val2 |
预期输出
| CODE | total_blocks | group | other_cols | group_count | blocks |
|---|---|---|---|---|---|
| A | 12 | G1 | val1 | 3 | 4 |
| A | 12 | G2 | val1 | 3 | 4 |
| A | 12 | G3 | val1 | 3 | 4 |
| B | 8 | G4 | val2 | 2 | 4 |
| B | 8 | G5 | val2 | 2 | 4 |
解决方案
核心是按CODE分组计算去重后的group数量,再将total_blocks均分到对应行。
方法1:窗口函数(主流数据库支持)
直接用窗口函数按CODE分区,计算去重group的数量,再做除法:
SELECT *, COUNT(DISTINCT "group") OVER (PARTITION BY CODE) AS group_count, total_blocks / COUNT(DISTINCT "group") OVER (PARTITION BY CODE) AS blocks FROM your_table;
注意:
group是SQL关键字,需用引号包裹(PostgreSQL用双引号,MySQL用反引号`)避免语法错误。
方法2:子查询关联(兼容旧版数据库)
如果你的数据库不支持窗口函数中的COUNT(DISTINCT),可以先预计算每个CODE的分组数,再关联原表:
WITH code_group_stats AS ( SELECT CODE, COUNT(DISTINCT "group") AS group_count FROM your_table GROUP BY CODE ) SELECT t.*, c.group_count, t.total_blocks / c.group_count AS blocks FROM your_table t JOIN code_group_stats c ON t.CODE = c.CODE;
精度处理
如果需要保留小数精度,可将整数转换为浮点型:
-- PostgreSQL写法 total_blocks::FLOAT / group_count AS blocks -- 通用写法 CAST(total_blocks AS DECIMAL(10,2)) / group_count AS blocks
内容的提问来源于stack exchange,提问作者Tanmay
相关产品推荐
相关产品推荐

