我需要你的帮助.我想规范化组内的数字.说我有这个数据集:
A B C ------- 0 1 3 1 1 0 1 1 2 1 1 4 1 2 1 1 2 1
我想用A和B对这些行进行分组,然后对其组内的C值进行归一化,即对该组的所有C进行求和,然后将每个C除以该总和.在上面的例子中,我希望这个结果:
A B C --------- 0 1 1 // sum of C's in group is 1, 1/1=1 1 1 0 // sum of C's in group is 6, 0/6=0 1 1 1/3 // ... 1 1 2/3 // ... 1 2 1/2 // sum of C's in group is 2, 1/2=1/2 1 2 1/2 // ...
除以零可以单独处理.如何使用SQL(或PSQL,如果有帮助)这样做?我原则上可以想办法做到这一点,但我总是最终使用深度嵌套的SELECT,我想避免.
提前致谢!
您可以使用窗口函数:
SELECT a,b, 1.0 * c / CASE WHEN SUM(c) OVER(PARTITION BY a,b) = 0 THEN 1 ELSE SUM(c) OVER(PARTITION BY a,b) END AS c FROM tab
SqlFiddleDemo
输出:
???????????????????????????????? ? a ? b ? c ? ???????????????????????????????? ? 0 ? 1 ? 1 ? ? 1 ? 1 ? 0 ? ? 1 ? 1 ? 0.3333333333333333 ? ? 1 ? 1 ? 0.6666666666666666 ? ? 1 ? 2 ? 0.5 ? ? 1 ? 2 ? 0.5 ? ? 2 ? 2 ? 0 ? -- added for check division by 0 ????????????????????????????????