如何将列的单行值除以另一列按分组聚合后的值并保留单行数据?
如何将列的单行值除以另一列按分组聚合后的值并保留单行数据?
嘿,你的思路其实已经非常接近正确答案了,只是不小心把分子分母搞反啦!
你想要实现的是每行的score 2值除以同name分组下所有score 1的总和,同时保留每一行的原始数据——这种需求刚好可以用窗口函数完美解决,窗口函数的优势就是能在不聚合行的前提下,给每行计算出对应的分组聚合值。
正确的SQL查询语句
SELECT name, "score 1" AS score1, "score 2" AS score2, "score 2" / SUM("score 1") OVER (PARTITION BY name) AS "score % 2" FROM your_table_name;
为什么你的原写法不对?
你之前写的Score 1/SUM(Score 2) OVER (PARTITION BY Name),一是把要用来做除法的列搞反了(应该用score 2当分子,分组后的score 1总和当分母),二是如果你的列名带空格,记得用引号或者反引号包裹,避免语法错误。
用你的测试数据验证结果
假设你的表数据是:
| name | score 1 | score 2 |
|---|---|---|
| reed | 30 | 10 |
| reed | 50 | 20 |
| brick | 60 | 30 |
| brick | 60 | 12 |
运行上面的查询后,会得到你想要的结果:
| name | score1 | score2 | score % 2 |
|---|---|---|---|
| reed | 30 | 10 | 0.125 |
| reed | 50 | 20 | 0.25 |
| brick | 60 | 30 | 0.25 |
| brick | 60 | 12 | 0.1 |
这里要提一句,你示例里最后一行的10/(60+60)应该是笔误,实际是12/(60+60)=0.1哦。
总结一下:这种需求完全是可行的,窗口函数就是专门用来处理这种“既要分组计算聚合值,又要保留单行原始数据”的场景,只要调整好分子分母的对应关系就可以啦!
备注:内容来源于stack exchange,提问作者sasakikoji928
相关产品推荐
相关产品推荐

