4

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

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-16 00:00:00        8

你会如何选择这个来填补时间空白,总是取最后一条记录?

所以输出将是:

--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

我还想不出一个巧妙的解决方案。我想这可以用 DATEDIFF 和一个 for 循环来完成,但我希望这可以更容易地完成。

4

2 回答 2

4

您有 2 个问题正在尝试解决。第一个问题是如何填补空白。第二个问题是为那些缺失的记录填充计数字段。

问题 1:这可以通过使用 aDates 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:这是 acorrelated subquery派上用场的地方(尽管我通常远离它们)从原始表中获取最后一个 cnt :

SELECT r.dtfield, 
   (SELECT TOP 1 cnt
    FROM yourtable 
    WHERE dt <= r.dtfield 
    ORDER BY dt DESC) cnt
FROM RecursiveCTE r
于 2013-05-29T16:51:37.387 回答
1

我的解决方案是这样的。

第 1 步:有一个包含所有日期的日期表。- 您可以使用多种方法,例如:获取两个日期之间的日期列表

第 2 步:从日期表到结果集执行左外部。- 这将导致您得到以下结果集:将此表称为“TEST_DATE_COUnt”

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-19 00:00:00        0
2011-09-18 00:00:00        0
2011-09-17 00:00:00        0
2011-09-16 00:00:00        8

第 3 步:执行递归查询,如下所示:

SELECT t1.date_x, t1.count_x,
   (case when count_x=0 then (SELECT max(COUNT_X)
    FROM TEST_DATE_COUNT r 
    WHERE r.DATE_X <= t1.DATE_X) 
    else COUNT_X
    end) 
    cnt
FROM TEST_DATE_COUNT t1

请让我知道这是否有效。我测试了它并且有效。

于 2013-05-29T17:02:50.367 回答