您将在下面找到要使用的测试数据。我需要的是一个dense_rank,rank,row_number,无论是什么函数来获取编号为" NoRequired"的行。 我测试了每个rank和row_number函数,甚至尝试使用WITH语句,但还没有提出解决方案。
我想这里的主要问题是"排名功能"一旦在...之间存在不同的键值,就需要跳过序列...
(?=....)
答案 0 :(得分:3)
这是一个“群岛问题”。一种简单的方法是使用滞后和累积和:
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;
这个想法是识别值变化的行,然后对这些值进行累积求和。
答案 1 :(得分:0)
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