Berechnen Sie die Anzahl der Datensätze für jedes Datum zwischen zwei Daten
In Datenbanksystemen ist es häufig erforderlich, Daten basierend auf einem bestimmten Datum abzurufen Reichweite. SQL bietet integrierte Funktionen und Techniken, um diese Aufgabe zu erleichtern. In diesem Artikel geht es um die Herausforderung, die Anzahl der Datensätze für jedes Datum innerhalb eines bestimmten Datumsbereichs zu berechnen.
Problemstellung
Bei zwei Datumsangaben soll ein erstellt werden Abfrage, die die Anzahl der Datensätze für jedes Datum innerhalb dieses Bereichs zurückgibt. Nehmen wir zur Veranschaulichung an, wir möchten die Anzahl der Supportanfragen, die zwischen dem 1. November 2020 und dem 22. Februar 2021 erstellt wurden, aus einer Tabelle mit dem Namen tbl_Support_Requests abrufen.
Fehlgeschlagener Versuch
Ein erster Versuch, dieses Problem zu lösen, bestand darin, einen Common Table Expression (CTE) namens Date_Range_T zu verwenden Generieren Sie eine sequentielle Liste von Daten innerhalb des angegebenen Bereichs. Allerdings führte die rekursive Definition des CTE zu einem Operandentypkonflikt zwischen datetime2 und int.
Lösung
Um dieses Problem zu lösen, besteht ein effizienterer Ansatz in der Verwendung einer Tally Tabelle oder Funktion. Zähltabellen, auch Zahlengeneratoren genannt, stellen eine Reihe fortlaufender Zahlen bereit, die als Quelle für die Generierung einer Reihe von Daten dienen können.
Das Folgende ist eine optimierte Lösung unter Verwendung der Zähltabellenfunktion von Itzik Ben-Gan:
DECLARE @StartDate date = '2020-11-01', @EndDate date = '2021-02-22'; WITH L0 AS ( SELECT 1 AS c FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1), (1),(1),(1),(1),(1),(1),(1),(1)) AS D(c) ), L1 AS ( SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B ), L2 AS ( SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B ), Nums AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum FROM L2 ) Date_Range_T (d_range) AS ( SELECT TOP(DATEDIFF(day, @StartDate, @EndDate) + 1) DATEADD(day, rownum - 1, @StartDate) AS d_range, DATEADD(day, rownum, @StartDate) AS d_rangeNext FROM Nums ) SELECT d_range, COUNT(Id) AS Total FROM Date_Range_T LEFT JOIN tbl_Support_Requests R ON R.CreatedDate >= T.d_range AND R.CreatedDate < T.d_rangeNext GROUP BY d_range ORDER BY d_range ASC
Diese Lösung generiert einen Datumsbereich innerhalb des angegebenen Bereichs (#StartDate# bis #EndDate#), einschließlich der Endpunktdaten. Anschließend verknüpft es diese Bereichstabelle mit der Tabelle tbl_Support_Requests in der Spalte „CreatedDate“ und filtert nach Datensätzen, die in jeden Datumsbereich fallen. Schließlich werden die Ergebnisse nach Datum gruppiert und die Anzahl der Datensätze für jedes Datum gezählt.
Das obige ist der detaillierte Inhalt vonWie zähle ich tägliche Datensätze innerhalb eines bestimmten Datumsbereichs in SQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!