使用日期列填补数据中缺失的空白

时间:2019-02-20 15:02:09

标签: sql tsql

我有一个临时表返回此输出

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

2 个答案:

答案 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

Sample Demo

使用递归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)