0

我有一张如下表,

Table 
Date1           Date2       Priority    level
1/1/1970    10/31/2013  -1  A
12/1/2013   10/31/2014  -1  A
12/31/2013  1/31/2016   1   B
12/31/2012  10/31/2018  1   C
12/31/2012  10/31/2019  2   C
12/31/2012  12/31/9999  3   C
12/31/2011  12/31/9999  4   C

我需要根据级别和优先级找到重叠和偏移日期范围。结果

Date1            Date2          level
1/1/1970    10/31/2013  A
12/1/2013   10/31/2014  A
10/31/2014  1/31/2016   B
10/31/2013  12/1/2013   C
1/31/2016   10/31/2019  C
10/31/2019  12/31/9999  C

从视觉上看,这将给出以下内容:

A[---------]-------------------------------------------------------------------------------
A----------------[-----------------]-------------------------------------------------------
B---------------------[------------------]-------------------------------------------------
C--------[----------------------------------------]----------------------------------------
C--------[-------------------------------------------------]-------------------------------
C--------[--------------------------------------------------------------------------------]
C----[------------------------------------------------------------------------------------]

结果

A[---------]-------------------------------------------------------------------------------
A----------------[-----------------]-------------------------------------------------------
B----------------------------------[-----]-------------------------------------------------
C----------[-----]-------------------------------------------------------------------------
C-----------------------------------------[----------------]-------------------------------
C-----------------------------------------------------------[-----------------------------]
4

1 回答 1

0

这里只是一些想法。SQL小提琴在这里:http ://sqlfiddle.com/#!2/f6acc/5

首先,创建一个包含两列的表:

CREATE TABLE [Map] ([Date] datetime, [Level] char(1) NULL)

使用以下内容填充该表:

INSERT [Map]([Date])
SELECT Date1 FROM [Table] UNION
SELECT Date2 FROM [Table]

现在,您的 [Map] 表包含原始 [Table] 中唯一日期的列表。现在是时候找出每个日期属于哪个级别了。所以你做这样的事情:

UPDATE [Map] FROM [Map]
    INNER JOIN [Table] ON [Date] >= [Date1] AND [Date] < [Date2]
SET [Map].[Level] = 'A'
WHERE [Table].[Levle] = 'A' AND [Map].[Level] IS NULL

对每个级别、B、C 等重复上述 SQL(可能在循环中?)。现在,您的 [Map] 表包含按优先顺序排列的非重叠间隔:

[Date]      [Level]
1/1/1970    A
12/31/2011  A
12/31/2013  A
10/31/2013  C
12/1/2013   A
12/31/2013
10/31/2014  B
1/31/2016   C
--...and so on

所以我们只需要把它变成你想要的输出形式。我们可以通过按 [Date] 顺序扫描 [Map] 表的行,并注意 [Level] 何时发生变化。它可以在一个循环中完成,但肯定也应该有一个很好的 SQL 方式来完成它,我现在只是无法理解它。

于 2013-09-04T20:42:36.517 回答