【问题标题】:Get percentage of all rows in a similar grouping获取相似分组中所有行的百分比
【发布时间】:2021-01-14 10:00:51
【问题描述】:

在 PostgreSQL 中,如何在输出所有行的同时获得同一组(例如“retailer”)中所有其他行(例如“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

【问题讨论】:

    标签: sql postgresql select sum window-functions


    【解决方案1】:

    使用窗口函数:

    select t.*, val::numeric / nullif(sum(val) over(partition by category), 0) res
    from mytable t
    

    窗口sum() 计算具有相同category 的行的总val

    注意事项:

    • 看起来val 是一个整数;如果是这样,我们需要将至少一个值转换为小数以避免整数除法

    • 如果所有类别都具有0 值,则nullif() 避免除以零错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多