如何根据规则获取逐年数据

时间:2018-08-08 16:42:36

标签: sql tsql sql-server-2012

我有一个带有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  

请帮助。

0 个答案:

没有答案