Heim >Datenbank >MySQL-Tutorial >Wie zähle ich tägliche Datensätze innerhalb eines bestimmten Datumsbereichs in SQL?

Wie zähle ich tägliche Datensätze innerhalb eines bestimmten Datumsbereichs in SQL?

Linda Hamilton
Linda HamiltonOriginal
2024-12-19 11:52:13691Durchsuche

How to Count Daily Records Within a Specified Date Range in SQL?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn