SQL中如何统计相邻两个Furnace_life=1区间的最大值
需求描述
- 测试表为SQL Server临时表
#t1,包含ID、Furnace_life两个整型字段,存储炉次相关数据 - 数据按
ID升序排列后,以Furnace_life值为1的记录作为分段起点,每段范围为:当前值为1的记录开始,到下一个值为1的记录前的所有记录 - 统计目标:输出每一段内
Furnace_life字段的最大值
实现方案
采用窗口函数打段标分组的方式实现,逻辑如下:
- 按ID升序遍历数据,每遇到一条
Furnace_life=1的记录就给段号加1,同一段内所有记录共享同一个段号 - 按段号分组,直接计算每组
Furnace_life的最大值即可,不需要递归、游标这类低效写法
完整运行代码
-- 1. 创建测试表并插入测试数据 CREATE TABLE #t1 ( ID int, Furnace_life INT); INSERT INTO #t1(ID,Furnace_life) VALUES (1,1) INSERT INTO #t1(ID,Furnace_life) VALUES (2,2) INSERT INTO #t1(ID,Furnace_life) VALUES (3,3) INSERT INTO #t1(ID,Furnace_life) VALUES (4,4) INSERT INTO #t1(ID,Furnace_life) VALUES (5,1) INSERT INTO #t1(ID,Furnace_life) VALUES (6,2) INSERT INTO #t1(ID,Furnace_life) VALUES (7,3) INSERT INTO #t1(ID,Furnace_life) VALUES (17,1) INSERT INTO #t1(ID,Furnace_life) VALUES (18,2) -- 2. 分段统计 WITH seg_tag AS ( SELECT *, SUM(CASE WHEN Furnace_life = 1 THEN 1 ELSE 0 END) OVER( ORDER BY ID ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS seg_id FROM #t1 ) SELECT seg_id AS 段序号, MIN(ID) AS 段起始ID, MAX(Furnace_life) AS 段内炉龄最大值 FROM seg_tag GROUP BY seg_id ORDER BY seg_id; -- 3. 清理临时表 DROP TABLE #t1
运行结果
执行代码后输出3条统计结果:
- 第1段:起始ID为1,段内炉龄最大值为4
- 第2段:起始ID为5,段内炉龄最大值为3
- 第3段:起始ID为17,段内炉龄最大值为2
内容的提问来源于stack exchange,提问作者Yas Ka
相关产品推荐
相关产品推荐

