Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie füllt man die Lücken?

Sie haben zwei Probleme, die Sie lösen möchten. Die erste Frage ist, wie man die Lücken füllt. Das zweite Problem besteht darin, das Feld „Anzahl“ für diese fehlenden Datensätze aufzufüllen.

Problem 1:Dieses Problem kann gelöst werden, indem entweder eine Dates Lookup table verwendet wird oder indem Sie einen recursive common table expression erstellen . Ich würde empfehlen, dafür eine Datums-Nachschlagetabelle zu erstellen, wenn dies eine Option ist. Wenn Sie eine solche Tabelle nicht erstellen können, brauchen Sie so etwas.

WITH CTE AS (
  SELECT MAX(dt) maxdate, MIN(dt) mindate
  FROM yourtable
  ),
RecursiveCTE AS (
  SELECT mindate dtfield
  FROM CTE
  UNION ALL
  SELECT DATEADD(day, 1, dtfield)
  FROM RecursiveCTE R 
    JOIN CTE T
      ON R.dtfield < T.maxdate
  )

Das sollte Ihnen eine Liste von Daten erstellen, die mit MIN beginnen Datum in Ihrer Tabelle und endet mit MAX .

Problem 2:Hier ist eine correlated subquery wäre praktisch (so sehr ich mich im Allgemeinen von ihnen fernhalte), um den letzten cnt aus Ihrer ursprünglichen Tabelle zu erhalten:

SELECT r.dtfield, 
   (SELECT TOP 1 cnt
    FROM yourtable 
    WHERE dt <= r.dtfield 
    ORDER BY dt DESC) cnt
FROM RecursiveCTE r