3

我有以下 sql 查询:

    SELECT DATE(time), ROUND(AVG(out_temp),2)
    FROM data_table
    WHERE id= 1 AND time BETWEEN '2012-08-18' AND '2012-08-30'
    GROUP BY DATE(time)
    ORDER BY time ASC

这将返回:

    date         avg_temp
    2012-08-18   11.41
    2012-08-19   5.90
    2012-08-28   11.22
    2012-08-29   10.07

到目前为止一切正常......但我想添加具有恒定值的缺失日期,如下所示:

    date         avg_temp
    2012-08-18   11.41
    2012-08-19   5.90
    2012-08-20   <value>
    ...          ...
    2012-08-27   <value>
    2012-08-28   11.22
    2012-08-29   10.07

我应该如何修改我的查询?有人可以帮我解决这个问题吗?我阅读了一些关于使用预填充日期值创建单独的日历表的帖子,但我仍然没有让它工作。

4

2 回答 2

1

如果您的数据表实际上有每个日期的数据,您可以这样做:

SELECT thedate, coalesce(ROUND(AVG(out_temp),2), <value>)
FROM (select distinct date(time) as thedate
      from data_table
     ) dates left outer join
     data_table dt
     on date(time) = thedates.date
WHERE id= 1 AND thedate BETWEEN '2012-08-18' AND '2012-08-30'
GROUP BY thedate
ORDER BY time ASC

您需要的是一个驱动表来生成您需要的日期。然后,您可以左连接到此表,以获取所需的摘要。COALESCE 函数允许您输入默认值。

于 2012-09-12T17:42:20.983 回答
1

创建一个包含您需要的所有日期的表,然后执行 LEFT JOIN。例如

CREATE TABLE calendar ( day DATE PRIMARY KEY );

然后插入表中,可能在您的编程语言上使用循环(伪代码):

for day in day_range( start_date, end_date ):
   query( 'INSERT INTO calendar VALUES ( ' + day + ' );' );

然后做一个左连接:

SELECT DATE(day), ROUND(AVG(out_temp),2)
FROM data_table LEFT JOIN calendar ON data_table.time = calendar.day
WHERE id= 1 AND day BETWEEN '2012-08-18' AND '2012-08-30'
GROUP BY DATE(day)
ORDER BY day ASC
于 2012-09-12T17:44:14.300 回答