首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在sql中获得1到下一个1之间的最大值

如何在sql中获得1到下一个1之间的最大值
EN

Stack Overflow用户
提问于 2022-07-01 15:28:23
回答 4查看 73关注 0票数 1
代码语言:javascript
运行
复制
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)



SELECT * FROM #t1 AS t ORDER BY t.ID ASC;


DROP TABLE #t1

我想得到从1到下一个1/开始从1到下一个/的最大值。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-07-02 07:17:56

您可以使用下面的脚本。注比记录必须按ID排序!

代码语言:javascript
运行
复制
CREATE TABLE #t2 ( ID int, Furnace_life INT, TopLife INT NULL);

INSERT INTO #t2
(
    ID,
    Furnace_life,
    TopLife
)
SELECT t.ID,t.Furnace_life,
      LAG(t.Furnace_life) OVER (ORDER BY t.ID) TopLife
    FROM #t1 t
ORDER BY ID


SELECT * FROM #t2 AS t WHERE t.Furnace_life = 1 AND t.TopLife IS NOT NULL

DROP TABLE #t1
DROP TABLE #t2
票数 3
EN

Stack Overflow用户

发布于 2022-07-01 17:02:32

如果数据符合要求,则可以使用此代码。

代码语言:javascript
运行
复制
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)


CREATE TABLE #TMPTBL (ID INT ,MAX_Furnace_life INT)

SELECT * FROM #t1 AS t ORDER BY t.ID ASC;

DECLARE @Max_Furnace_life INT = 0
DECLARE @MAXID INT = 0
DECLARE @Furnace_life INT
DECLARE @ID INT

DECLARE db_cursor CURSOR FOR 

    SELECT ID , Furnace_life FROM #t1 AS t ORDER BY t.ID ASC

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @ID ,@Furnace_life

WHILE @@FETCH_STATUS = 0  
BEGIN  
      
    IF @Furnace_life < @Max_Furnace_life
    BEGIN
        INSERT INTO #TMPTBL (ID ,MAX_Furnace_life) VALUES (@MAXID ,@Max_Furnace_life)
        SET @Max_Furnace_life = 0
        SET @MAXID = 0
    END
    ELSE
    BEGIN
        SET @Max_Furnace_life = @Furnace_life
        SET @MAXID = @ID
    END

    FETCH NEXT FROM db_cursor INTO @ID ,@Furnace_life
END 

CLOSE db_cursor  
DEALLOCATE db_cursor

-- For End Of Records
INSERT INTO #TMPTBL(ID ,MAX_Furnace_life) SELECT TOP 1 * FROM #t1 ORDER BY ID DESC
SELECT * FROM #TMPTBL

DROP TABLE #t1
DROP TABLE #TMPTBL
票数 0
EN

Stack Overflow用户

发布于 2022-07-01 17:49:58

这是一个经典的gaps-and-islands 问题。有很多技术。

这里有一个相当简单的例子。

  • 使用LAG来获取上一行的值。
  • 使用该ID向上加窗的条件
  • 创建值组(岛),接受MAX值并按其排序,仅取最高值。

代码语言:javascript
运行
复制
WITH PrevValues AS (
    SELECT *,
      Prev = LAG(t.Furnace_life) OVER (ORDER BY t.ID)
    FROM #t1 t
),
Groups AS (
    SELECT *,
      GroupId = COUNT(CASE WHEN t.Prev = t.Furnace_life THEN NULL ELSE 1 END) OVER (ORDER BY Furnace_life ROWS UNBOUNDED PRECEDING)
    FROM PrevValues t
)
SELECT TOP (1)
  Highest_Furnace_life = MAX(g.Furnace_life)
FROM Groups g
ORDER BY
  Highest_Furnace_life DESC;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72831509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档