我有一张表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
答案 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