如果配置文件具有多个成员资格的表格Profiles
和Memberships
,如何根据成员资格数查询配置文件?
例如,我想获得具有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
答案 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;