如何填补空白?

Fab*_*ler 6 sql sql-server-2005 date

假设我有两条记录,都有日期和计数:

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-16 00:00:00        8
Run Code Online (Sandbox Code Playgroud)

您将如何选择它来填补时间间隙,始终采用最后一条记录?

所以输出将是:

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-19 00:00:00        8
2011-09-18 00:00:00        8
2011-09-17 00:00:00        8
2011-09-16 00:00:00        8
Run Code Online (Sandbox Code Playgroud)

我还无法找到一个巧妙的解决方案。我想这可以通过 DATEDIFF 和 for 循环来完成,但我希望这可以更容易地完成。

sge*_*des 6

您有 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
  )
Run Code Online (Sandbox Code Playgroud)

这应该会创建一个日期列表,以MIN表中的日期开始,以MAX.

问题 2:这是 acorrelated subquery可以派上用场的地方(尽管我通常远离它们)从原始表中获取最后一个 cnt:

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