我有一个带有ID和日期的表,我需要两个输出,如下所示。我将输入一个输入日期,并且我需要根据以下条件进行记录
输出1:对于第一行,第一行日期1年月末数据和第一行日期2年月末数据以及if数据,我需要小于或等于日期的数据是月末在特定年份不可用,然后在该行返回null。
输出2:与第一个相同,但有所不同,我需要第一行date-1和-2上可用的任何数据,我不需要null。
declare @tbl table (id int , marketdate date )
insert into @tbl (id,marketdate)
values (1,'2018-05-31'),
(1,'2017-05-29'),
(1,'2016-05-31'),
(2,'2018-02-28'),
(2,'2017-02-28'),
(2,'2016-02-29'),
(2,'2016-02-28')
我的查询:
;with cte as (
select id , marketdate
from (
select id , marketdate ,row_number() over(partition by id order by marketdate desc) rn
from @tbl
where marketdate <='2018-06-05'
) a where rn=1
union all
select id , marketdate
from (
select b.id , b.marketdate ,row_number() over(partition by b.id order by b.marketdate desc) rn
from @tbl b inner join cte c
on b.id= c.id
where b.marketdate<= dateadd(year,-1,c.marketdate )
) b where rn=1
)
select * from cte
order by id, marketdate desc
输出1:
1 2018-05-31
1 NUll
1 2016-05-31
2 2018-02-28
2 2017-02-28
2 2016-02-29
输出2:
1 2018-05-31
1 2017-05-29
1 2016-05-31
2 2018-02-28
2 2017-02-28
2 2016-02-29
请帮助。