没有看到我的这种解法,发出来给大家参考下,我也不知道自己是不是瞎猫撞死耗子了,问了豆包,一开始它反驳我不对,我解释了一下,它就开始给我道歉,我也是无语……

前面的递归查询没有什么特殊的,需要注意的是要一直带上递归开始的root_id。我的解法核心在于叶子节点的计算,采用的是两个count相减,share_id是全部的节点,包括叶子节点和非叶子节点,parent_id是全部的非叶子节点,取distinct后两者相减即为叶子节点。

with recursive base as (
select
share_id,
parent_share_id,
play_seconds,
0 depth,
sharer_account_id,
sharer_account_id root_account_id,
share_id root_share_id
from clip_share_events
where clip_id = 9001 and parent_share_id is null
and share_time >= '2025-07-01' and share_time < '2025-07-08'
union all
select
c.share_id,
c.parent_share_id,
c.play_seconds,
depth+1 depth,
c.sharer_account_id,
b.root_account_id,
b.root_share_id
from clip_share_events c
join base b
on c.parent_share_id = b.share_id
where c.clip_id = 9001
)

select
b.root_share_id,
p.account_name root_account_name,
count(*) total_share_count,
max(b.depth) max_depth,
count(distinct b.share_id)-count(distinct b.parent_share_id) leaf_share_count,
count(distinct b.sharer_account_id) distinct_account_count,
round(sum(b.play_seconds)/60,2) total_play_minutes
from base b 
left join podcast_accounts p on b.root_account_id = p.account_id
group by b.root_share_id, p.account_name 
order by max_depth desc, distinct_account_count desc, total_share_count desc, root_share_id