如何获得树中根节点的最大引用数
How to get max count of referral to a root node in a tree
我有一个 table 用户结构如下:
id name parent_id
1 Mike
2 Jack 1
3 Sam 1
4 Kurt 1
5 Somebody 3
6 Tommy 4
6 etc.. 2
如何获得每个用户第一级嵌套的最大推荐数,通过这个例子我期望结果:
3 because Jack, Sam, Kurt is a referral of Mike on first level
假设 "first level" 由 parent_id IS NULL
和当前版本 Postgres 9.4 定义:
SELECT parent_id, count(*) AS referral_ct
FROM (
SELECT id AS parent_id
FROM tbl
WHERE t1.parent_id IS NULL
) t1
JOIN tbl t2 USING (parent_id)
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1; -- to only get 1 row with max. referral_ct
只有几个根节点,JOIN LATERAL
可能会更快:
SELECT t1.id, t2.referral_ct
FROM (
SELECT id
FROM tbl
WHERE parent_id IS NULL
) t1
LEFT JOIN LATERAL (
SELECT parent_id, count(*) AS referral_ct
FROM tbl
WHERE parent_id = t1.id
GROUP BY 1
) t2 ON true
ORDER BY 2 DESC
LIMIT 1; -- to only get 1 row with max. referral_ct
相关,更多解释:
- Optimize GROUP BY query to retrieve latest record per user
我有一个 table 用户结构如下:
id name parent_id
1 Mike
2 Jack 1
3 Sam 1
4 Kurt 1
5 Somebody 3
6 Tommy 4
6 etc.. 2
如何获得每个用户第一级嵌套的最大推荐数,通过这个例子我期望结果:
3 because Jack, Sam, Kurt is a referral of Mike on first level
假设 "first level" 由 parent_id IS NULL
和当前版本 Postgres 9.4 定义:
SELECT parent_id, count(*) AS referral_ct
FROM (
SELECT id AS parent_id
FROM tbl
WHERE t1.parent_id IS NULL
) t1
JOIN tbl t2 USING (parent_id)
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1; -- to only get 1 row with max. referral_ct
只有几个根节点,JOIN LATERAL
可能会更快:
SELECT t1.id, t2.referral_ct
FROM (
SELECT id
FROM tbl
WHERE parent_id IS NULL
) t1
LEFT JOIN LATERAL (
SELECT parent_id, count(*) AS referral_ct
FROM tbl
WHERE parent_id = t1.id
GROUP BY 1
) t2 ON true
ORDER BY 2 DESC
LIMIT 1; -- to only get 1 row with max. referral_ct
相关,更多解释:
- Optimize GROUP BY query to retrieve latest record per user