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

如何按日期分组获取每日聚合最大值对应的原始行?

多日场景下获取每日用户计数峰值及原始行的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:54:57