Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment combler les lacunes ?

Vous avez 2 problèmes que vous essayez de résoudre. La première question est de savoir comment combler les lacunes. Le deuxième problème est de remplir le champ Nombre pour les enregistrements manquants.

Problème 1 :ce problème peut être résolu en utilisant une Dates Lookup table ou en créant une recursive common table expression . Je recommanderais de créer une table de recherche de dates pour cela si c'est une option. Si vous ne pouvez pas créer une telle table, vous aurez besoin de quelque chose comme ça.

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
  )

Cela devrait vous créer une liste de dates commençant par le MIN date dans votre tableau et se terminant par le MAX .

Problème 2 :Voici où se trouve une correlated subquery serait utile (autant que je reste généralement loin d'eux) pour obtenir le dernier cnt de votre table d'origine :

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