Sql 行数/密集列(组和岛)

Sql 行数/密集列(组和岛),sql,sql-server,row-number,gaps-and-islands,dense-rank,Sql,Sql Server,Row Number,Gaps And Islands,Dense Rank,在下面,您将找到要使用的测试数据。我需要的是一个稠密的_-rank,rank,row _-number函数,无论什么函数,都可以将行编号为“NoRequired”。 我测试了每个rank和row_number函数,甚至尝试使用语句,但还没有找到解决方案 我想这里的主要问题是,“秩函数”需要跳过一个序列,一旦其中有一个不同的键值 DECLARE @data TABLE (ID int IDENTITY(1,1), X int, NoRequired int); INSERT INTO @data

在下面,您将找到要使用的测试数据。我需要的是一个稠密的_-rank,rank,row _-number函数,无论什么函数,都可以将行编号为“NoRequired”。 我测试了每个rank和row_number函数,甚至尝试使用语句,但还没有找到解决方案

我想这里的主要问题是,“秩函数”需要跳过一个序列,一旦其中有一个不同的键值

DECLARE @data TABLE (ID int IDENTITY(1,1), X int, NoRequired int);

INSERT INTO @data(X, NoRequired)
    VALUES (1000,1), (1000,1), (800,2), (600,3), (1000,4), (1000,4), (800,5);

SELECT *
FROM @data;
这是一个“群体和岛屿”问题。一种简单的方法是使用滞后和累积和:

select d.*,
       sum(case when prev_x = x then 0 else 1 end) over (order by id) as NoRequired
from (select d.*, lag(x) over (order by id) as prev_x
      from @data d
     ) d;
其思想是识别值发生变化的行,然后对这些值进行累计和。

DECLARE@data TABLE(ID int IDENTITY(1,1),X int,norrequired int);
DECLARE @data TABLE (ID int IDENTITY(1,1), X int, NoRequired int);

INSERT INTO @data(X, NoRequired)
    VALUES (1000,1), (1000,1), (800,2), (600,3), (1000,4), (1000,4), (800,5);

SELECT D.ID, D.X, D.NoRequired, MAX(RQ.RN) MyVal  FROM @DATA D JOIN 
            (SELECT D1.ID, ROW_NUMBER() OVER (ORDER BY D1.ID) RN FROM @data D1 
                LEFT JOIN @data D2
                    ON D1.ID = D2.Id + 1 
                    AND D1.X = D2.X
                        WHERE D2.Id IS NULL) RQ 
            ON RQ.ID <= D.ID
            GROUP BY D.ID, D.X, D.NoRequired 
            ORDER BY D.ID
插入@data(X,不需要) 值(1000,1)、(1000,1)、(800,2)、(600,3)、(1000,4)、(1000,4)、(800,5); 从@DATA D JOIN中选择D.ID、D.X、D.NoRequired、MAX(RQ.RN)MyVal (从@data D1中选择(按D1.ID排序)RN上方的D1.ID,行号() 左连接@data D2 在D1.ID=D2.ID+1上 D1.X=D2.X 其中D2.Id为NULL)RQ 在RQ.ID上,您可能感兴趣