Поиск пробелов (пропущенных записей) в записях базы данных с использованием SQL - PullRequest
7 голосов
/ 22 апреля 2010

У меня есть таблица с записями для каждого часа подряд.Каждый час имеет определенную ценность.Я хочу, чтобы запрос 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

Ответы [ 2 ]

17 голосов
/ 22 апреля 2010

Предполагая, что все записи являются точными часами:

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)
0 голосов
/ 22 апреля 2010

Единственный способ решить эту проблему - создать таблицу со всеми ожидаемыми датами, а затем выполнить соединение с таблицей, которую вы хотите проверить на наличие пробелов.Вы можете создать функцию, которая принимает 2 даты, возвращает таблицу со всеми почасовыми датами между этими двумя датами, поэтому вам не нужно создавать новую таблицу каждый раз, когда вы хотите найти все пропуски за данный период.

Это решение на основе множеств, если у вас есть таблица со всеми датами в ней.Я не думаю, что есть способ сделать это без предварительного создания таблицы с датами, и я уверен, что вы не можете сделать это на основе набора.

...