删除distinct 并简单地创建视图
create view SomeView
as
select artikelnr
, datum
, jahr_kw
, first_value(menge) over (partition by artikelnr, jahr_kw
order by (case when menge is not null then 1 else 2 end), datum desc
) as imputed_Jahr_KW
from test_table
由于datum 是由视图投影而没有应用任何查询运算符,因此您可以从视图外部有效地对其进行过滤。
select *
from SomeView
where datum between '2021-02-01' and '2021-03-01'
EG:
drop table if exists test_table
create table test_table
(
artikelnr int,
datum varchar(20),
jahr_kw int,
menge int
)
insert into test_table
values
(1,'01.Jan',1,10),
(1,'01.Jan',2,7),
(1,'01.Jan',3,1),
(1,'02.Jan',1,null),
(1,'02.Jan',2,5),
(1,'02.Jan',3,2),
(1,'03.Jan',1,null),
(1,'03.Jan',2,4),
(1,'03.Jan',3,3),
(1,'04.Jan',1,null),
(1,'04.Jan',2,9),
(1,'04.Jan',3,4),
(1,'01.Jan',1,20),
(1,'01.Jan',2,10),
(1,'01.Jan',3,4),
(1,'02.Jan',1,30),
(1,'02.Jan',2,20),
(1,'02.Jan',3,3),
(1,'03.Jan',1,null),
(1,'03.Jan',2,15),
(1,'03.Jan',3,2)
go
create or alter view vT
as
select artikelnr
, datum
, jahr_kw
, first_value(menge) over (partition by artikelnr, jahr_kw
order by (case when menge is not null then 1 else 2 end), datum desc
) as imputed_Jahr_KW
from test_table
go
select distinct artikelnr
, datum
, jahr_kw
, first_value(menge) over (partition by artikelnr, jahr_kw
order by (case when menge is not null then 1 else 2 end), datum desc
) as imputed_Jahr_KW
from test_table
where datum between '01.Jan' and '03.Jan' -- for example
select *
from vt
where datum between '01.Jan' and '03.Jan' -- for example