MSSQL按分钟分组统计value升序前2数据条数并输出时间区间
实现思路
- 第一步:时间对齐到分钟维度,使用
DATEADD和DATEDIFF函数计算每条数据所属分钟的起始时间,起始时间加59秒即为对应分钟的结束时间。 - 第二步:分钟内排名,使用窗口函数
DENSE_RANK()在每个分钟分组内对value做升序排名,相同value会获得相同排名,且排名序号连续不会跳号,符合升序取前2类值的统计需求。 - 第三步:过滤统计,筛选出排名小于等于2的行,按分钟维度聚合计数即可得到最终结果。
完整MSSQL查询代码
WITH minute_data AS ( SELECT -- 计算当前数据所属分钟的起始时间 DATEADD(minute, DATEDIFF(minute, 0, [timestamp]), 0) AS starttime, -- 计算当前数据所属分钟的结束时间 DATEADD(second, 59, DATEADD(minute, DATEDIFF(minute, 0, [timestamp]), 0)) AS endtime, value, -- 每分钟内按value升序排名 DENSE_RANK() OVER ( PARTITION BY DATEADD(minute, DATEDIFF(minute, 0, [timestamp]), 0) ORDER BY value ASC ) AS value_rank FROM YourTableName -- 替换为实际表名 ) SELECT starttime, endtime, COUNT(*) AS number FROM minute_data WHERE value_rank <= 2 GROUP BY starttime, endtime ORDER BY starttime
补充说明
如果需求中前2排名需要跳过并列(比如3个并列第一的情况下,第二小的值算作第4名),把DENSE_RANK()替换为RANK()即可。
内容的提问来源于stack exchange,提问作者Amamra
相关产品推荐
相关产品推荐

