Sql 行数/密集列(组和岛)
在下面,您将找到要使用的测试数据。我需要的是一个稠密的_-rank,rank,row _-number函数,无论什么函数,都可以将行编号为“NoRequired”。 我测试了每个rank和row_number函数,甚至尝试使用语句,但还没有找到解决方案 我想这里的主要问题是,“秩函数”需要跳过一个序列,一旦其中有一个不同的键值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
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上,您可能感兴趣