sql >> Database >  >> RDS >> Sqlserver

Hoe de gaten opvullen?

Je hebt twee problemen die je probeert op te lossen. Het eerste probleem is hoe de lacunes kunnen worden opgevuld. Het tweede probleem is het invullen van het veld Aantal voor de ontbrekende records.

Probleem 1:Dit kan worden opgelost door een Dates Lookup table te gebruiken of door een recursive common table expression te maken . Ik zou aanraden om hiervoor een Date Lookup-tabel te maken als dat een optie is. Als je zo'n tabel niet kunt maken, heb je zoiets als dit nodig.

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
  )

Dat zou u een lijst met datums moeten maken die beginnen met de MIN datum in uw tabel en eindigend op de MAX .

Probleem 2:Hier is waar een correlated subquery zou van pas komen (zoveel als ik er over het algemeen uit de buurt blijf) om de laatste cnt van je originele tafel te krijgen:

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


  1. welke query is beter en efficiënter - mysql

  2. PostgreSQL retourneert een functie met een aangepast gegevenstype

  3. Hoe de verbindingstime-out in groovy sql in te stellen?

  4. CTE retourneert fout