您有2个要解决的问题。第一个问题是如何填补空白。第二个问题是为那些缺少的记录填充“计数”字段。
问题1:这可以通过使用Dates Lookup table
或创建一个来解决recursive common table expression
。如果可以的话,我建议为此创建一个“日期查询”表。如果您不能创建这样的表,那么您将需要这样的东西。
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
)
这将为您创建一个日期列表,该MIN
日期列表从表中的日期开始,以结束MAX
。
问题2:在这里可以correlated subquery
派上用场(就像我通常在远离它们的地方一样),可以从原始表中获取最后一个cnt:
SELECT r.dtfield,
(SELECT TOP 1 cnt
FROM yourtable
WHERE dt <= r.dtfield
ORDER BY dt DESC) cnt
FROM RecursiveCTE r