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)
| 归档时间: |
|
| 查看次数: |
3847 次 |
| 最近记录: |