当前位置:  开发笔记 > 数据库 > 正文

使用SQL规范化组内的值

如何解决《使用SQL规范化组内的值》经验,为你挑选了1个好方法。

我需要你的帮助.我想规范化组内的数字.说我有这个数据集:

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,我想避免.

提前致谢!



1> Lukasz Szozd..:

您可以使用窗口函数:

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
????????????????????????????????

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有