haz*_*ard 11 sql-server sql-server-2008-r2 gaps-and-islands
我正在处理的表包含三个组成部分:
ID
列(另一个表中的主键)from
/to
列。价值观:
ID Data From To
1 a 2015-01-01 2015-01-05
1 a 2015-01-06 2015-01-10
1 b 2015-01-11 2015-01-15
1 a 2015-01-16 2015-01-20
2 c 2015-01-01 2015-01-05
2 c 2015-01-06 2015-01-10
Run Code Online (Sandbox Code Playgroud)
该表通过以某些时间间隔拍摄另一个数据源的“快照”并将有效日期分配给记录来更新。问题是这些快照会为在该时间间隔内根本没有更改的记录(具有不同的有效日期)创建重复条目。
我想通过查找具有连续日期的行并合并它们并为它们分配一个有效期来减小表的大小。例如:
ID Data From To
1 a 2015-01-01 2015-01-10
1 b 2015-01-11 2015-01-15
1 a 2015-01-16 2015-01-20
2 c 2015-01-01 2015-01-10
Run Code Online (Sandbox Code Playgroud)
我目前的逻辑是:
我知道游标效率很低(我有一个很大的数据集),所以我正在寻找其他方法。
如果这只是一个背靠背范围的表,你的情况可以被视为一个经典的“间隙和孤岛”问题,你只需要隔离连续范围的孤岛,然后通过取最小值[from]
和[to]
每个岛的最大值。
有一种使用两个 ROW_NUMBER 调用来解决这个问题的既定方法:
WITH islands AS
(
SELECT
id,
data,
[from],
[to],
island = ROW_NUMBER() OVER (PARTITION BY id ORDER BY [from])
- ROW_NUMBER() OVER (PARTITION BY id, data ORDER BY [from])
FROM
#mergeTest
)
SELECT
id,
data,
[from] = MIN([from]),
[to] = MAX([to])
FROM
islands
GROUP BY
id,
data,
island
;
Run Code Online (Sandbox Code Playgroud)
此查询将在与 SQL Server 2005 一样低的版本中工作。
归档时间: |
|
查看次数: |
12610 次 |
最近记录: |