5

我有一个格式如下的 SQL 表:

8/1/2012   0.111
8/2/2012   0.222
8/5/2012   0.333
.
.
.

我想运行一个查询,该查询将在指定日期范围内获取第二列中的平均值。对于不存在的日期(上表中的 8/3/2012 和 8/4/2012),我想使用最后一个已知值 (0.222) 作为缺失日期。我该怎么做呢?

4

1 回答 1

3

编辑:对不起,我想我第一次认为这确实有效时我想念这个问题(已测试)

我做的事情:

  1. 创建了一个临时表进行测试(包括在内以便您进行测试)
  2. 创建了一个递归公用表表达式,该表达式创建了一个名为 Dates 的表(这样我就可以拥有从给定日期到另一个日期的所有日期)
  3. 该查询有一个子查询,它返回一个表,其中包含范围内的所有日期,并且对于每个日期,表中的最大日期以及给定日期之前的值
  4. 该表与具有值的表连接,然后计算平均值

    CREATE TABLE #Table1 (date_column  DateTime, Value Decimal(5,4))
    INSERT INTO #Table1 VALUES ('20120804', 0.1234)
    INSERT INTO #Table1 VALUES ('20120808', 0.2222)
    INSERT INTO #Table1 VALUES ('20120809', 0.9876)
    INSERT INTO #Table1 VALUES ('20120812', 0.0505);
    
    WITH Dates(date_column , row )
    AS (SELECT Cast('20120804' as datetime) date_column, 0 as row
    UNION ALL
    SELECT DateAdd(Day, 1, date_column), row + 1
    FROM Dates
    WHERE date_column < '20120830'
    ) 
    SELECT AVG(Value) FROM (
    SELECT Dates.date_column, (SELECT  MAX(date_column)
    FROM #Table1 WHERE #Table1.date_column <= Dates.date_column) maxDateWithValue 
    FROM Dates
    ) AllDatesWithLastDateWithValue
    LEFT JOIN #Table1 ON AllDatesWithLastDateWithValue.maxDateWithValue = #Table1.date_column 
    WHERE AllDatesWithLastDateWithValue.date_column >= '20120804'
    AND AllDatesWithLastDateWithValue.date_column <= '20120815'
    

希望这会有所帮助...好问题...

于 2012-08-17T03:34:45.247 回答