【问题标题】:Fill missing rows using RECURSIVE CTE in SQL SERVER在 SQL SERVER 中使用 RECURSIVE CTE 填充缺失的行
【发布时间】:2020-12-11 06:53:35
【问题描述】:

输入

id, date, value  
1, '2020-01-01', 100  
1, '2020-01-03', 200  
1, '2020-01-05', 500  

预期输出

1, '2020-01-01', 100  
1, '2020-01-02', 100  
1, '2020-01-03', 200  
1, '2020-01-04', 200  
1, '2020-01-05', 500

我不想使用任何与之一起加入的日历表。 我想用递归 CTE 来实现这一点

【问题讨论】:

标签: sql-server-2012 missing-data recursive-cte


【解决方案1】:

样本数据

create table data
(
  d date,
  i int
);

insert into data (d, i) values
('2020-01-01', 100),
('2020-01-03', 200),
('2020-01-05', 500);

解决方案

with maxDate as
(
  select max(d.d) as maxDate
  from data d
),
rcte as
(
  select d.d, d.i
  from data d
    union all
  select dateadd(day, 1, r.d), r.i
  from rcte r
  cross join maxDate md
  where r.d < md.maxDate
)
select '1' as [id],
       r.d as [date],
       max(r.i) as [value]
from rcte r
group by r.d
order by r.d;

结果

id  date        value
--- ----------- -----
1   2020-01-01  100
1   2020-01-02  100
1   2020-01-03  200
1   2020-01-04  200
1   2020-01-05  500

Fiddle

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 2017-03-03
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多