You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用SQL计算标题连续进入Top10的周数?

实现Netflix式Top10连续上榜周数计算

问题背景

需要复刻Netflix的“Top10上榜周数”功能,基于包含Title、User_id、Watch_time、Date的原始数据,计算每个标题连续进入周度Top10的周数,同时统计该标题的累计独立观众数。

分步SQL实现

1. 生成周度聚合数据

先从原始数据按周、标题分组,计算核心指标:

with weekly_agg as (
    select 
        title,
        count(distinct user_id) as viewers,
        sum(watch_time) / 3600 as hours_watched,
        -- 生成周结束日期(按周日收尾的周,可根据需求调整周起始规则)
        date_trunc('week', date) + interval '6 days' as week_end
    from raw_data
    group by title, date_trunc('week', date)
),

2. 筛选周度Top10标题

计算每周排名,仅保留进入Top10的记录:

ranked_data as (
    select 
        title,
        viewers,
        hours_watched,
        week_end,
        row_number() over (partition by week_end order by viewers desc) as title_rank
    from weekly_agg
    -- 不同SQL方言语法可能不同:Snowflake用qualify,Hive/Spark需用子查询筛选
    qualify title_rank <= 10
),

3. 用缺口岛屿算法计算连续上榜周数

通过标记连续周的分组键,识别连续上榜的区间:

continuous_weeks as (
    select 
        title,
        week_end,
        row_number() over (partition by title order by week_end) as rn,
        -- 连续周的group_key会相同,非连续周会生成新的key
        date_add(week_end, interval -rn day) as group_key
    from ranked_data
),

4. 统计最终结果

计算每个标题的最大连续上榜周数,以及累计独立观众数:

final_result as (
    select 
        c.title,
        max(count(c.week_end)) as weeks_in_top_10,
        -- 统计该标题的累计独立观众数
        (select count(distinct user_id) from raw_data where title = c.title) as viewers
    from continuous_weeks c
    group by c.title, c.group_key
    order by weeks_in_top_10 desc
)
select title, weeks_in_top_10, viewers from final_result;

最终输出

TitleWeeks_in_top_10Viewers
A25
B11

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:52:10