【问题标题】:Postgresql frequency table with percentage partition over and group by具有百分比分区和分组依据的 Postgresql 频率表
【发布时间】:2020-07-13 13:54:22
【问题描述】:

我正在尝试在 Postgresql 中创建一个带有百分比的频率表

如果有人熟悉 SAS,我正在尝试重新创建 proc 频率表

下面我试图通过 var1,var2 上的 group by 获取频率

var1     var2    frequency  percentage 
A        20       1          33%
A        30       1          33%
A        40       1          33%
B        20       4          80%
B        30       1          20%

现在这很容易

select var1
,var2
,count(*)
from table
group by 1,2

棘手的是我尝试添加一个百分比列,该列基于 var1 分布执行 %

select var1
,var2
,count(*)
,count(*)/count(*) over(partition by var1)
from table
group by 1,2

上面的代码我得到了一个错误的答案

【问题讨论】:

    标签: sql postgresql group-by frequency


    【解决方案1】:

    您想要求和 count(*) 值。所以:

    select var1, var2, count(*),
           count(*) * 1.0 / sum(count(*)) over (partition by var1)
    from table
    group by 1, 2;
    

    您的代码只计算聚合后每个var 的行数。。因此,它实际上返回的是加权平均值——这可能有用但不是您想要的。

    【讨论】:

    • 效果很好,谢谢!我不太清楚为什么在分区上对 count(*) 求和会得到预聚合总和?
    • @Mobix 。 . .我试图在答案中解释这一点。 count(*) 是结果集每一行的聚合结果。然后sum() 将其加到所有行上——总数。
    猜你喜欢
    • 2018-05-08
    • 2019-09-29
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多