試試這個:
;with cte as
(select *,
coalesce(row_index - (lag(row_index) over (order by event)),1) diff
from tbl
),
cte2 as
(select *,
(select max(diff)
from cte c
where c.row_index <= d.row_index
) minri
from cte d
)
select event, row_index, minri,
dense_rank() over (order by minri) rn
from cte2
- 第一CTE得到使用
lag
功能 (可從SQL Server 2012年起)的差異。
- 當差值超過1時,下一個CTE計算出 ,並將指定 之後的所有記錄指向「組」,直到找到下一個差異<> 1。這是 分組的關鍵一步。
- 最後一步是使用
dense_rank
而不是 在上一步中計算的指標,以根據需要獲取行號 。
此解決方案並具有限制在它將如果差異是不按遞增順序即,如果你在諸如52和53的樣品數據中的兩個以上值失敗,它將它們分爲組3而不是創建一個新的組。
Demo
更新:下面的方法能夠克服上述限制:
;with cte as
(select *,
coalesce(row_index - (lag(row_index) over (order by event)),1) diff
from tbl)
,cte2 as
(select *,
diff - coalesce(diff - (lag(diff) over (order by event)),0) tmp
from cte d)
select event,row_index,
1 + sum(case when tmp >= diff then 0 else 1 end) over (order by event) risum
from cte2
同樣的第一步是相同的。但在步驟2中,我們只檢查是否轉換爲連續值之間的差值的不同值,而不是使用最小/最大值函數。排名然後使用條件總和爲原始數據中的每個值分配一個組。
Demo
這可以進一步簡化爲:
select event, row_index,
sum(case when diff <= 1 then 0 else 1 end) over (order by event) as rb
from
(select *,
row_index - (lag(row_index) over (order by event)) diff
from tbl
) s
SQL的哪個版本服務器? –
@ shree.pat18更新 – dimebucker91