我有一个临时表返回此输出
PRICE | DATE
1.491500 | 2019-02-01
1.494000 | 2019-02-04
1.486500 | 2019-02-06
我想通过使用日期复制数据之前的最后一个已知记录来填补数据中的缺失。是他们动态更新具有所需输出的现有临时表或创建新临时表的一种方法:
PRICE | DATE
1.491500 | 2019-02-01
1.491500 | 2019-02-02
1.491500 | 2019-02-03
1.494000 | 2019-02-04
1.494000 | 2019-02-05
1.486500 | 2019-02-06
我正在使用sql server 2008r2
答案 0 :(得分:1)
由于SQL Server在 <?xml version="1.0" standalone="yes"?>
<DsCyclicLoading xmlns="http://tempuri.org/DsCyclicLoading.xsd">
<CyclicLoading>
<ComponentID>3</ComponentID>
<ComponentName>GHI</ComponentName>
<Standard>789</Standard>
<CaseName>Normal Very Hot Start</CaseName>
</CyclicLoading>
<CyclicLoading>
<ComponentID>1</ComponentID>
<ComponentName>ABC</ComponentName>
<Standard>123</Standard>
<CaseName>Normal Cold Start</CaseName>
</CyclicLoading>
<CyclicLoading>
<ComponentID>2</ComponentID>
<ComponentName>DEF</ComponentName>
<Standard>456</Standard>
<CaseName>Normal Warm Start</CaseName>
</CyclicLoading>
</DsCyclicLoading>
中不支持IGNORE NULLS
,因此有些棘手。我将使用以下形式的递归子查询:
LAG()
Here是db <>小提琴。
在SQL Server 2008中,您可以将with cte as (
select price, date, dateadd(day, -1, lead(date) over (order by date)) as last_date
from t
union all
select price, dateadd(day, 1, date), last_date
from cte
where date < last_date
)
select price, date
from cte
order by date;
替换为:
lead()
答案 1 :(得分:0)
假设有一个日期表(如果没有,您可以轻松地创建一个),则可以通过将现有表与日期表连接起来来实现。此后,使用运行总和为找到的每个日期分配组。每组的最大值是填写缺失值所需要的。
select dt,max(price) over(partition by grp) as price
from (select p.price,d.dt,sum(case when p.dt is null then 0 else 1 end) over(order by d.dt) as grp
from dates d
left join prices p on p.dt = d.dt
) t
使用递归cte制作日期表。坚持下去。
--Generate dates in 2019
with dates(dt) as (select cast('2019-01-01' as date)
union all
select dateadd(day,1,dt)
from dates
where dt < '2019-12-31'
)
select * from dates
option(maxrecursion 0)