Нахождение разрывов (отсутствующий записи) в записях базы данных с помощью SQL

У меня есть таблица с записями в течение каждого часа подряд. Каждый час имеет некоторое значение. Я хочу, чтобы запрос T-SQL получил недостающие записи (недостающие часы, разрывы). Таким образом для DDL ниже, я должен получить запись в течение недостающего часа 01.04.2010 2:00 (предполагающий, что диапазон дат между первой и последней записью). Использование 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
7
задан pilcrow 10 September 2012 в 19:08
поделиться

2 ответа

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

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)
17
ответ дан 6 December 2019 в 11:47
поделиться

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

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

0
ответ дан 6 December 2019 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: