技术求助:每日TOP贡献页面订阅占比统计及页面名称补充需求
解决方法:补充每日最高贡献页面的名称
你的核心问题是原SQL仅计算了每日最高订阅量及其占比,但无法关联到对应的页面名称——因为按P_date分组后,PageName不在分组字段中,直接添加会导致结果不准确(不同数据库的处理逻辑可能不一致,但通常无法正确匹配到订阅量最高的页面)。
我们可以通过窗口函数来精准定位每个日期订阅量最高的页面,同时保留你需要的占比计算逻辑。下面是修改后的SQL代码:
WITH daily_totals AS ( -- 计算每个日期的总订阅量 SELECT P_date, SUM(Subscribes) AS daily_total FROM table1 GROUP BY P_date ), overall_total AS ( -- 计算全时段的总订阅量 SELECT SUM(Subscribes) AS full_total FROM table1 ), ranked_pages AS ( -- 给每个日期下的页面按订阅量降序排名 SELECT P_date, PageName, Subscribes, ROW_NUMBER() OVER (PARTITION BY P_date ORDER BY Subscribes DESC) AS rank_num FROM table1 ) -- 筛选出每日排名第一的页面,计算占比 SELECT rp.P_date, rp.PageName, FORMAT(rp.Subscribes / dt.daily_total, '.00%') AS '当日订阅占比', FORMAT(rp.Subscribes / ot.full_total, '.00%') AS '全时段订阅占比' FROM ranked_pages rp JOIN daily_totals dt ON rp.P_date = dt.P_date CROSS JOIN overall_total ot WHERE rp.rank_num = 1 ORDER BY rp.P_date;
代码说明:
daily_totals:单独计算每个日期的总订阅量,用于后续计算当日占比。overall_total:计算全时段的总订阅量,避免在主查询中重复执行子查询,提升效率。ranked_pages:使用ROW_NUMBER()窗口函数,按日期分组(PARTITION BY P_date),并对每个分组内的页面按订阅量降序排名,排名第一的就是当日贡献最高的页面。- 最后关联三个CTE,筛选出排名第一的记录,格式化占比为百分比格式。
额外说明:
如果同一天存在多个页面订阅量并列最高的情况,ROW_NUMBER()只会返回其中一个。若需要返回所有并列第一的页面,只需将ROW_NUMBER()替换为RANK()或DENSE_RANK()即可。
内容的提问来源于stack exchange,提问作者sammy ben menahem
相关产品推荐
相关产品推荐

