如何按日期分组获取每日聚合最大值对应的原始行?
多日场景下获取每日用户计数峰值及原始行的SQL方案
核心思路是利用窗口函数按日期分组计算并排序,无需用UNION拼接语句,也不需要复杂的GROUP BY+HAVING组合。以下是适配你场景的SQL实现:
WITH daily_agg AS ( -- 计算每个时间点的总用户数,并按日期分组给记录排名 SELECT DATE(create_time) AS day_date, create_time, SUM(user_count) OVER (PARTITION BY create_time) AS total_users, ROW_NUMBER() OVER ( PARTITION BY DATE(create_time) ORDER BY SUM(user_count) OVER (PARTITION BY create_time) DESC ) AS rank_in_day FROM device_counts ), daily_peak AS ( -- 筛选出每日的峰值时间点 SELECT create_time, total_users FROM daily_agg WHERE rank_in_day = 1 ) -- 关联原表获取峰值时间点的所有原始行 SELECT dc.*, dp.total_users AS daily_peak_total FROM device_counts dc JOIN daily_peak dp ON dc.create_time = dp.create_time;
关键说明:
daily_agg部分:通过PARTITION BY create_time计算每个5分钟时间点的总用户数,再用ROW_NUMBER()按日期分组,对每个日期内的时间点按总用户数降序排名,排名为1的就是当日峰值。- 如果当日存在多个并列的峰值时间点(总用户数相同且均为最大值),只需把
ROW_NUMBER()替换为RANK(),即可保留所有并列的峰值记录。 - 最终通过JOIN关联原表,直接获取峰值时间点对应的所有设备原始行数据。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

