没有看到我的这种解法,发出来给大家参考下,我也不知道自己是不是瞎猫撞死耗子了,问了豆包,一开始它反驳我不对,我解释了一下,它就开始给我道歉,我也是无语……
前面的递归查询没有什么特殊的,需要注意的是要一直带上递归开始的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

京公网安备 11010502036488号