Sql 获取相似分组中所有行的百分比

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

在PostgreSQL中,如何在仍然输出所有行的情况下获得同一组(例如“零售商”)中所有其他行(例如“val”)的平均值

例如,在下面,我想获得每行
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
    值,则避免被零除的错误