从最近一年开始连续几年的SQL查询

时间:2017-07-17 18:35:47

标签: sql sql-server tsql

我有一张表Temp:

 CREATE TABLE Temp 
( 
  [ID]  [int],
  [Year]  [INT],
 )
**ID    Year**
1 2016
1   2016
1   2015
1   2012
1   2011
1   2010
2   2016
2   2015
2   2014
2   2012
2   2011
2   2010
2   2009
3   2016
3   2015
3   2004
3   1999
4   2016
4   2015
4   2014
4   2010
5   2016
5   2014
5   2013

我想计算从最近一年开始的连续总年数。 结果应如下所示:

ID  Total Consecutive Yrs
1   2
2   3
3   2
4   3
5   1

3 个答案:

答案 0 :(得分:1)

你可以使用铅并获得如下计数:

Select top (1) with ties Id, RowN as [Total Consecutive Years] from (
    Select *, Num = case when ([year]- lead(year) over(partition by Id order by [Year] desc) > 1) then 0 else 1 end 
        , RowN = Row_Number() over (partition by Id order by [Year] desc)
    from temp
) a
where a.Num = 0
order by row_number() over(partition by Id order by RowN)

输出如下:

+----+-------------------------+
| Id | Total Consecutive Years |
+----+-------------------------+
|  1 |                       2 |
|  2 |                       3 |
|  3 |                       2 |
|  4 |                       3 |
|  5 |                       1 |
+----+-------------------------+

答案 1 :(得分:0)

select ID,
   -- returns a sequence without gaps for consecutive years
   first_value(year) over (partition by ID order by year desc) - year +1 as x, 
   -- returns a sequence without gaps
   row_number() over (partition by ID order by year desc) as rn
from Temp

e.g。对于ID = 1:

1   2016    1   1
1   2015    2   2
1   2012    5   3
1   2011    6   4
1   2010    7   5

只要没有间隙,两个序列都会相同。

现在检查相等的序列并计算行数:

with cte as 
 (
   select ID,
      -- returns a sequence without gaps for consecutive years
      first_value(year) over (partition by ID order by year desc) - year + 1 as x, 
      -- returns a sequence without gaps
      row_number() over (partition by ID order by year desc) as rn
   from Temp

 ) 
select ID, count(*)
from cte
where x = rn  -- no gap
group by ID

编辑:

根据您的年零评论:

with cte as 
 (
   select ID, year,
      -- returns a sequence without gaps for consecutive years
      first_value(year) over (partition by ID order by year desc) - year + 1 as x, 
      -- returns a sequence without gaps
      row_number() over (partition by ID order by year desc) as rn
   from Temp

 ) 
select ID, 
   -- remove the year zero from counting
   sum(case when year <> 0 then 1 else 0 end)
from cte
where x = rn
group by ID

答案 2 :(得分:-1)

您可以使用窗口功能执行此操作:

R.java

这假设“最近一年”是每个身份。