如何通过计数结果标准化组?

时间:2016-03-03 22:30:03

标签: postgresql

“分组依据”计数的结果如何通过计数的总和来标准化?

例如,给定:

User     Rating (1-5)
----------------------
1        3
1        4
1        2
3        5
4        3
3        2
2        3

结果将是:

User    Count   Percentage
---------------------------
1       3      .42         (=3/7)
2       1      .14         (=1/7)
3       2      .28         (...)
4       1      .14

因此,对于每个用户,他们提供的评分数量是每个人提供的总评分百分比。

2 个答案:

答案 0 :(得分:1)

SELECT DISTINCT ON (user) user, count(*) OVER (PARTITION BY user) AS cnt,
       count(*) OVER (PARTITION BY user) / count(*) OVER () AS percentage;

count(*) OVER (PARTITION BY user)是所谓的window function。窗口函数允许您通过某个“分区”创建的“窗口”执行某些操作,该分区在此处通过用户ID进行。简单易懂的英语:为每个不同的count(*)值计算分区user,因此实际上它会计算每个user值的行数。

答案 1 :(得分:0)

如果不使用窗口函数或变量,则需要在第二个“maxed”子查询上交叉连接分组子查询,然后再次选择以返回可以使用的子集。

SELECT
    B.UserID,
    B.UserCount,
    A.CountAll
FROM
(
    SELECT 
        CountAll=SUM(UserCount)
    FROM
    (
        SELECT      
            UserCount=COUNT(*)
        FROM
            MyTable
        GROUP BY
            UserID
    ) AS A    
)AS C
CROSS JOIN(
        SELECT
            UserID,
            UserCount=COUNT(*)
        FROM
            MyTable
        GROUP BY
            UserID
)AS B