考虑下表,
CREATE TABLE temp (
[TabName] VARCHAR(255),
[ID] VARCHAR(255),
[AsOfDate] DATE)
INSERT INTO temp VALUES
('TAB1', 'C103', '2019-05-01'),
('TAB1', 'C103', '2019-06-01'),
('TAB2', 'C103', '2019-06-01'),
('TAB2', 'C103', '2019-07-01'),
('TAB1', 'C103', '2019-09-01'),
('TAB1', 'C104', '2019-06-01'),
('TAB1', 'C104', '2019-08-01')
TabName ID AsOfDate
TAB1 C103 '2019-05-01'
TAB1 C103 '2019-06-01'
TAB2 C103 '2019-06-01'
TAB2 C103 '2019-07-01'
TAB1 C103 '2019-09-01'
TAB1 C104 '2019-06-01'
TAB1 C104 '2019-08-01'
TAB1 C105 '2019-04-01'
TAB1 C105 '2019-05-01'
我想从表中查找已跳过日期的 ID。在此表中,我想确定 ID C103 和 C104 已跳过日期,因为它们已从“2019-07-01”跳到“2019-09-01”和“2019-06-01”跳到“2019-8” -01'。
我发现之前提出的以下问题Find Missing Dates in Data我相信这为该方法提供了一些潜在的线索,即使用 CTE,但是,我不确定如何将它们应用于整个表中日期不连续的问题.
我们应该在这里查看分区吗?
您可以使用递归 CTE 来实现这一点,并结合两个窗口函数(ROW_NUMBER和RANK)来生成当前日期值和前一个值之间的日期差的运行总计(按标签名和 id 组)。然后,您只选择日期差大于 1 的那些行。
如果您使用的是 SQL Server 2012 或更高版本,则有一种更简单的方法。使用LAG函数检索先前的值(按选项卡名和 id 分组)并对其执行 DATEDIFF。
下面包括示例,您可以在此db<>fiddle中看到它们的实际作用。
滞后示例:
递归 CTE 示例:
首先创建日历表。
以您想要的任何方式填充。
然后,