2010-04-22 9 views
6

Mam tabelę z zapisami dla każdej kolejnej godziny. Każda godzina ma pewną wartość. Chcę zapytania T-SQL, aby odzyskać brakujące rekordy (brakujące godziny, luki). Tak więc dla poniższego DDL powinienem uzyskać rekord za brakującą godzinę 04/01/2010 02:00 AM (przy założeniu, że zakres dat jest między pierwszym a ostatnim rekordem). Korzystanie z SQL Server 2005. Preferuj zapytanie oparte na zestawie.Znajdowanie luk (brakujących rekordów) w rekordach bazy danych przy użyciu SQL

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 

Odpowiedz

15

Zakładając, że wszystkie zapisy są dokładne godziny:

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) 
+2

OMG .... to jest fenomenalny, jak szybkie napisałeś to. Poprostu super. – Raja

+0

Nie mogę głosować w górę lub w dół, ponieważ patrzę na to sql going .. gaaaaahhahahaaaa –

+0

To słodkie zapytanie. Nigdy nie zdawałem sobie sprawy, że 'WITH' może być użyty rekurencyjnie. – RedFilter

0

Jedynym sposobem mogłem zobaczyć rozwiązać to byłoby utworzyć tabelę ze wszystkimi datami można oczekiwać, aby mieć, a następnie wykonać dołączyć do stołu chcesz sprawdzić przerwy. Możesz utworzyć funkcję, która pobiera 2 daty, zwraca tabelę ze wszystkimi datami godzinnymi między tymi dwiema datami, więc nie musisz tworzyć nowej tabeli za każdym razem, gdy chcesz znaleźć wszystkie luki w danym okresie.

To jest rozwiązanie oparte na zestawach, gdy masz już tabelę z wszystkimi datami. Nie sądzę, aby można to było zrobić bez uprzedniego wygenerowania tabeli z datami i jestem prawie pewien, że nie można tego zrobić w sposób oparty na zestawie.