Sql-Server
獲取表格中的每個狀態更改
我有一個表格,其中包含每個項目的狀態更改。該項目可以多次進入和退出一個狀態。
ItemTable (ItemId int, Status varchar(50), DateOfChange 日期)
我需要提取每次更改的日期。但是,由於每個項目的狀態可以重複,我不能只做 min(DateOfChange) 並找到出現的情況。
這是在 OLAP 環境中,用於提取此數據的子查詢是 KILLING 性能。
有沒有辦法通過分區/行號函式來提取這些東西?或者其他在 OLAP 中表現更好的東西?(這是在 SQL 2008 中。)
這種類型的要求是在“差距和島嶼”的旗幟下出現的。一種流行的方法是
WITH T AS (SELECT *, DENSE_RANK() OVER (PARTITION BY ItemId ORDER BY DateOfChange) - DENSE_RANK() OVER (PARTITION BY ItemId, Status ORDER BY DateOfChange) AS Grp FROM ItemTable) SELECT ItemId, Status, MIN(DateOfChange) AS Start, MAX(DateOfChange) AS Finish FROM T GROUP BY ItemId, Status, Grp ORDER BY Start