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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:57:17