如何按关系计数对结果进行分组

时间:2018-04-05 16:35:57

标签: sql postgresql

如果配置文件具有多个成员资格的表格ProfilesMemberships,如何根据成员资格数查询配置文件?

例如,我想获得具有2个会员资格的个人资料数量。我可以通过以下方式获取每个成员资格的个人资料数量:

SELECT "memberships"."profile_id", COUNT("profiles"."id") AS "membership_count"
FROM "profiles"
INNER JOIN "memberships" on "profiles"."id" = "memberships"."profile_id"
GROUP BY "memberships"."profile_id"

返回结果

profile_id | membership_count
_____________________________
1            2
2            5
3            2
...

但是如何对计数进行分组和求和以使查询返回结果,如:

n | profiles_with_n_memberships
_____________________________
1   36
2   28
3   29
...

甚至只是查询将返回

的单个n
profiles_with_2_memberships
___________________________
28

1 个答案:

答案 0 :(得分:1)

我没有您的示例数据,但我刚刚使用一个表重新创建了该方案:Demo

您可以使用LEFT JOIN generate_series()计数,并获得n成员资格缺失计数的零。如果您不想要零,只需使用第二个查询。

查询1

WITH c
AS (
    SELECT profile_id
        ,count(*) ct
    FROM Table1
    GROUP BY profile_id
    )
    ,m
AS (
    SELECT MAX(ct) AS max_ct
    FROM c
    )
SELECT n
    ,COUNT(c.profile_id)
FROM m
CROSS JOIN generate_series(1, m.max_ct) AS i(n)
LEFT JOIN c ON c.ct = i.n
GROUP BY n
ORDER BY n;

QUERY2

WITH c
AS (
    SELECT profile_id
        ,count(*) ct
    FROM Table1
    GROUP BY profile_id
    )
SELECT ct
      ,COUNT(*)
 FROM c 
GROUP BY ct
ORDER BY ct;