获取表中的每个状态更改

Val*_*rie 3 performance sql-server t-sql gaps-and-islands query-performance

我有一个表格,其中包含每个项目的状态更改。项目可以多次进入和退出状态。

ItemTable(ItemId int、Status varchar(50)、DateOfChange 日期)

我需要拉出每次更改的日期。但是,由于可以为每个项目重复状态,我不能只执行 min(DateOfChange) 并找到出现的次数。

这是在 OLAP 环境中,用于提取此数据的子查询正在降低性能。

有没有办法通过分区/行号函数来提取这些东西?或者其他在 OLAP 中表现更好的东西?(这是在 SQL 2008 中。)

Mar*_*ith 10

这种类型的要求打着“差距和孤岛”的旗号。一种流行的方法是

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 
Run Code Online (Sandbox Code Playgroud)