使用 SQL 查找数据库记录中的空白(缺失记录)

Posted

技术标签:

【中文标题】使用 SQL 查找数据库记录中的空白(缺失记录)【英文标题】:Finding gaps (missing records) in database records using SQL 【发布时间】:2010-04-22 17:50:36 【问题描述】:

我有一个表格,其中包含每个连续小时的记录。每个小时都有一些价值。我想要一个 T-SQL 查询来检索丢失的记录(丢失的小时数、间隙)。因此,对于下面的 DDL,我应该获得 04/01/2010 02:00 AM 的缺失小时记录(假设日期范围在第一条记录和最后一条记录之间)。使用 SQL Server 2005。首选基于集合的查询。

DDL:
CREATE TABLE [Readings](
    [StartDate] [datetime] NOT NULL,
    [SomeValue] [int] NOT NULL
)
INSERT INTO [Readings]([StartDate], [SomeValue])
SELECT '20100401 00:00:00.000', 2 UNION ALL
SELECT '20100401 01:00:00.000', 3 UNION ALL
SELECT '20100401 03:00:00.000', 45

【问题讨论】:

【参考方案1】:

假设所有记录都是准确的时间:

WITH    q(s, e) AS
        (
        SELECT  MIN(StartDate), MAX(StartDate)
        FROM    Readings
        UNION ALL
        SELECT  DATEADD(hour, 1, s), e
        FROM    q
        WHERE   s < e
        )
SELECT  *
FROM    q
WHERE   s NOT IN
        (
        SELECT  StartDate
        FROM    Readings
        )
OPTION (MAXRECURSION 0)

【讨论】:

我不能投赞成票或反对票,因为我正在查看这个 sql ...... gaaaaaahhahahaaaa 这是一个很好的查询。我从来没有意识到WITH 可以递归使用。 这很漂亮。我仍然做了大量的 2000 工作,所以我还没有完全理解递归 CTE 可以做什么。【参考方案2】:

我认为解决此问题的唯一方法是创建一个包含您希望拥有的所有日期的表,然后对要检查间隙的表执行连接。您可以创建一个需要 2 个日期的函数,它会返回一个包含这两个日期之间所有小时日期的表格,这样您就不必在每次想要查找给定时间段内的所有间隔时都创建一个新表格。

一旦您拥有包含所有日期的表格,这是一个基于集合的解决方案。我认为如果不首先生成带有日期的表格,就没有办法做到这一点,而且我很确定你不能以基于集合的方式做到这一点。

【讨论】:

以上是关于使用 SQL 查找数据库记录中的空白(缺失记录)的主要内容,如果未能解决你的问题,请参考以下文章

sql查找最小缺失值与重用被删除的键(转载)

您如何比较多个表中的记录但查找不同或缺失的值

SQL Server:查找缺失 ID 的有效方法

检查 Bigquery 分区表中的任何缺失天数记录

SQL 空值

Python查询sql db中的最后一条记录,但返回空白记录