2010-04-22 22 views
6

Ich habe eine Tabelle mit Datensätzen für jede aufeinander folgende Stunde. Jede Stunde hat einen Wert. Ich möchte eine T-SQL-Abfrage, um die fehlenden Datensätze (fehlende Stunden, die Lücken) abzurufen. Also für die DDL unten, sollte ich einen Rekord für fehlende Stunde 04/01/2010 02:00 Uhr (vorausgesetzt, Datumsbereich ist zwischen dem ersten und letzten Datensatz). Verwenden Sie SQL Server 2005. Bevorzugen Sie eine Set-basierte Abfrage.Finden von Lücken (fehlende Datensätze) in Datenbankeinträgen mit 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 

Antwort

15

Unter der Annahme, dass alle Datensätze sind genaue Stunden:

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 .... das ist phänomenal, wie schnell Sie diese geschrieben. Einfach toll. – Raja

+0

Ich kippe oben oder unten abstimmen dies becuase Im Blick auf diese sql going .. gaaaaahhahahaaaa –

+0

Das ist eine süße Abfrage. Ich habe nie realisiert, dass "WITH" rekursiv verwendet werden könnte. – RedFilter

0

Die einzige Art, wie ich dieses Problem zu lösen sehen könnte, wäre eine Tabelle erstellen mit allen Daten, die Sie zu erwarten haben, und dann eine auf die Tabelle, die Sie für Lücken überprüfen möchten beitreten auszuführen. Sie können eine Funktion erstellen, die 2 Daten zurückgibt und eine Tabelle mit allen stündlichen Daten zwischen diesen beiden Daten zurückgibt, so dass Sie nicht jedes Mal eine neue Tabelle erstellen müssen, wenn Sie alle Lücken in einem bestimmten Zeitraum finden möchten.

Dies ist eine Set-basierte Lösung, sobald Sie die Tabelle mit allen Daten darin haben. Ich glaube nicht, dass es einen Weg gibt, dies zu tun, ohne zuerst eine Tabelle mit den Daten zu erstellen, und ich bin mir ziemlich sicher, dass Sie das nicht auf eine Set-basierte Weise tun können.

Verwandte Themen