Sql 获取相似分组中所有行的百分比
在PostgreSQL中,如何在仍然输出所有行的情况下获得同一组(例如“零售商”)中所有其他行(例如“val”)的平均值 例如,在下面,我想获得每行Sql 获取相似分组中所有行的百分比,sql,postgresql,select,sum,window-functions,Sql,Postgresql,Select,Sum,Window Functions,在PostgreSQL中,如何在仍然输出所有行的情况下获得同一组(例如“零售商”)中所有其他行(例如“val”)的平均值 例如,在下面,我想获得每行val列相对于具有相同类别的所有其他行的百分比。我想对每个类别都这样做 Original table: id | category | val ---------------------------- 1 retailer 3 2 retailer 2 3 customer 1 4 retailer
val
列相对于具有相同类别的所有其他行的百分比。我想对每个类别都这样做
Original table:
id | category | val
----------------------------
1 retailer 3
2 retailer 2
3 customer 1
4 retailer 5
5 customer 7
Example:
id | category | val | output
----------------------------
1 retailer 3 .3 (retailer1 value + all other retailer values / total values of retailers)
2 retailer 2 .2 (retailer2 value + all other retailer values / total values of retailers)
3 customer 1 .125 (1 / 1 + 7)
4 retailer 5 .5 (5 / 3 + 2 + 5)
5 customer 7 .875 (7 / 1 + 7)
Complete output:
id | category | val | output
----------------------------
1 retailer 3 .3
2 retailer 2 .2
3 customer 1 .125
4 retailer 5 .5
5 customer 7 .875
使用窗口功能:
select t.*, val::numeric / nullif(sum(val) over(partition by category), 0) res
from mytable t
窗口sum()
计算具有相同类别的行的总val
注:
- 看起来
val
是一个整数;如果是这样,我们需要将至少一个值转换为十进制,以避免整数除法
nullif()
如果所有类别都有0
值,则避免被零除的错误