【问题标题】:Finding gaps (missing records) in database records using SQL使用 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

【问题讨论】:

    标签: sql sql-server tsql sql-server-2005 gaps-and-islands


    【解决方案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 个日期的函数,它会返回一个包含这两个日期之间所有小时日期的表格,这样您就不必在每次想要查找给定时间段内的所有间隔时都创建一个新表格。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      相关资源
      最近更新 更多