【发布时间】:2015-05-17 21:29:17
【问题描述】:
环境是 SQL Server 2014。
我正在处理将许多保险投保细节(第一个和最后一个小范围)缩减为更大的互斥 (ME) 连续投保范围。
为了清楚起见,问题简化为按 id、first、last 排序的样本数据。 F(n) 和 L(n) 是 id 内记录 n 中的第一个和最后一个值。
大多数细节范围都是典型的
- 相邻,F(n) = L(n-1) + 1
但细节里有魔鬼——欢迎来到真实世界的数据。
- 连接不相邻,F(n)
- 嵌入式,L(n)
- 重叠,L(n) > L(n-1)
- gap 定义了相互排斥的合并范围的边界
- ME(i).last = 先前 L 的最大值
这张图展示了大多数情况
Have
1 30 60 90 120
+-------+--------+--------+--------+
1 +-------+ (1:30)
2 +-------+ (31:60) adjacent
3 +--+ (40:50) embedded
4 + (61:61) adjacent some earlier
5 +-+ (61:65) adjacent some earlier
6 +--+ (61:75) adjacent some earlier
7 +--+ (65:80) overlap
8 +---------+ (85:120) gap, boundaries of ME ranges located
9 +-------+ (91:120)
10 +--+ (110:120)
Want
1 30 60 90 120
+-------+--------+--------+--------+
1 +----------------------+ (1:80)
2 +---------+ (85:120)
There are other unusual cases, such as embed followed by gap
.....
..
....
AAAAA BBBB
DROP TABLE #Details
CREATE TABLE #Details (id int, first int, last int);
insert into #Details values (1, 1, 30);
insert into #Details values (1, 31, 60);
insert into #Details values (1, 40, 50);
insert into #Details values (1, 61, 75);
insert into #Details values (1, 65, 80);
insert into #Details values (1, 85, 120);
insert into #Details values (1, 91, 120);
insert into #Details values (1, 110, 120);
我在堆栈和Refactoring Ranges 上阅读了一些答案,但无法实现我的数据排列。
--对于 jpw--
典型的分析可能涉及 20,000 个 ID 和 200 条详细记录。这些情况已通过下载到本地机器并在 SAS 数据步骤中处理(以类似光标的方式)进行处理。最坏的情况是订购 650K id 和 150M 详细信息 - 下载方式的数据过多,并导致其他资源问题。我相信所有细节都可能在 1.2B 行的范围内。无论如何,如果这一切都可以在 SQL Server 中完成,那么整个过程就被简化了。
【问题讨论】:
-
表格大概有多少行?数百、数千、数百万或更多?
-
典型分析可能涉及 20,000 个 id 和 200 条详细记录。
-
我在一个更大的数据集上尝试了我的方法,但结果根本不起作用......要多考虑一下。
-
我正在为你做几个例子,Richard。我处理过类似的事情。只是想找到我的代码。 2014 年的 LEAD 窗口功能也很有帮助。
标签: tsql date-range sql-server-2014 gaps-and-islands