Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como preencher as lacunas?


Você tem 2 problemas que está tentando resolver. A primeira questão é como preencher as lacunas. O segundo problema é preencher o campo Contagem para os registros ausentes.

Problema 1:Isso pode ser resolvido usando uma Dates Lookup table ou criando uma recursive common table expression . Eu recomendaria criar uma tabela de pesquisa de datas para isso, se essa for uma opção. Se você não puder criar essa tabela, precisará de algo assim.
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
  )

Isso deve criar uma lista de datas começando com o MIN data em sua tabela e terminando em MAX .

Problema 2:Aqui é onde uma correlated subquery seria útil (por mais que eu geralmente fique longe deles) para obter o último cnt da sua tabela original:
SELECT r.dtfield, 
   (SELECT TOP 1 cnt
    FROM yourtable 
    WHERE dt <= r.dtfield 
    ORDER BY dt DESC) cnt
FROM RecursiveCTE r