Sql-Server

獲取表格中的每個狀態更改

  • August 7, 2015

我有一個表格,其中包含每個項目的狀態更改。該項目可以多次進入和退出一個狀態。

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 

引用自:https://dba.stackexchange.com/questions/56593