选择日期

时间:2013-12-14 10:01:11

标签: sql select

我有一张表tem_data,其中包含温度值和日期

create table tem_data (id int not null, value float, date datetime);

仅当温度发生变化时,才会插入新值。 例如

  t   date
  15 12.09.2013
  17 15.09.2013
  23 19 09.2013

第二张表是报告的日子

create table rDays(rDay datetime);

   rDay

  12.09.2013
  13.09.2013
  14.09.2013
  16.09.2013
  17.09.2013
  18.09.2013
  23.09.2013

所有这些行都应该在报告中,因此我想让rDays的所有日子都有它的温度值。

       date              t
      12.09.2013       15
      13.09.2013       15
      14.09.2013       15
      16.09.2013       17
      17.09.2013       17 
      18.09.2013       17
      23.09.2013       19


select rDay,t from tem_data, rDays where ... ? , only ansi sql

2 个答案:

答案 0 :(得分:1)

假设您使用的是SQL Server。

请查看以下SQL Fiddle以获取一个工作示例。

http://sqlfiddle.com/#!6/8d306/1

答案是基于同一行的早期StackOverflow问题。

Filling in missing days for rows

with dates (start_date, end_date) as
(select  min(tem_date), max(tem_date)
 from    tem_data t
 union all
 select  dateadd(d, 1, start_date), end_date
 from    dates d
 where   start_date < end_date
)
select start_date, q.tem_value
from dates d
cross apply (select top 1 tem_value
             from tem_data t
             where t.tem_date <= d.start_date
             order by t.tem_date desc
             ) q
option (maxrecursion 0)

答案 1 :(得分:1)

你走了。请注意,您的上限是>而不是>=。如果你真的想要BETWEEN,你必须从结束日期中减去一个,我认为这是不必要的,因为它不会被显示。

WITH t AS (
SELECT date as start_date
     , coalesce(lead(date) over (order by date)
              , convert(datetime, '12/31/9999')) as end_date
     , value
  FROM tem_data
)
SELECT rDays.rDay
     , value
  FROM rDays
 INNER JOIN t
    ON t.start_date <= rDay
   AND t.end_date > rDay