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

SQL Server按小时分组时如何选取每小时Top N错误记录

SQL Server 按小时时段取错误计数Top N实现方案

问题场景

现有小时粒度错误统计表,核心字段如下:

  • Error:错误标识
  • StartTime:统计时段开始时间(整点)
  • EndTime:统计时段结束时间(下一个整点)
  • Count:对应时段内该错误的发生次数
    需要按每个小时时段分组,筛选出时段内发生次数排名Top 1或Top N的错误记录。
    样例数据预期输出:
  • 00:00-01:00时段Top1错误为error 2(计数9)
  • 01:00-02:00时段Top1错误为error 3(计数19)

实现代码

核心使用SQL Server窗口函数,按小时时段分区、错误计数倒序生成排名,再按排名阈值筛选即可。

取每时段Top1错误

WITH stat AS (
    SELECT
        Error,
        StartTime,
        EndTime,
        Count,
        -- 相同时段内按计数倒序排名,计数相同则并列
        RANK() OVER(PARTITION BY StartTime ORDER BY Count DESC) AS rank_num
    FROM 你的错误统计表名 -- 替换为实际表名
)
SELECT Error, StartTime, EndTime, Count
FROM stat
WHERE rank_num = 1;

如果你不需要并列第一、每个时段只返回1条结果,可以把RANK()替换为ROW_NUMBER(),同时在ORDER BY后追加Error作为兜底排序规则,保证结果稳定:
ROW_NUMBER() OVER(PARTITION BY StartTime ORDER BY Count DESC, Error) AS rank_num

上述代码在样例数据上的执行结果:

ErrorStartTimeEndTimeCount
error 22022-06-27 00:00:002022-06-27 01:00:009
error 32022-06-27 01:00:002022-06-27 02:00:0019

取每时段Top N错误(如Top5)

逻辑和Top1完全一致,仅需调整筛选时的排名阈值即可:

WITH stat AS (
    SELECT
        Error,
        StartTime,
        EndTime,
        Count,
        RANK() OVER(PARTITION BY StartTime ORDER BY Count DESC) AS rank_num
    FROM 你的错误统计表名
)
SELECT Error, StartTime, EndTime, Count
FROM stat
WHERE rank_num <= 5; -- 修改此处数字即可调整取前N位

说明

  • 因为表本身已经是按小时预聚合的,同一个小时段的StartTime值完全相同,直接用StartTime作为分区键即可,不需要额外做时间截断转换。
  • 排名函数选择参考:需要保留并列名次用RANK(),不需要并列、严格返回N条记录用ROW_NUMBER()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:27:16