2013-06-25 73 views
0

基本查询月份为:T-SQL:排名前5的查询

SELECT Top 5 
[Year], [Month], Title, Units, [Rank] 
from aTable 
WHERE [Year] = @Year and [Month] = @Month 
order by [Rank] desc 

我想添加什么,是[排名前月5]列,那会告诉我了一些每个连续两个月排名前5的排名已经排名5或更低。

+0

通过“连续两个月的”你的意思是排除非连续两个月?如果1月份是前5名,但不是2月份,3月份是前5名,那么目前的计数不应该包括1月份? –

+0

是的,我的意思是连续有多少个月排名前五位。如果是一年的第5位,四月份排名第6位,五月份回到第3位,我想表明它已经在前5名为1个月。 – Metaphor

+0

如果它不在目前没有显示在结果中的前5名? –

回答

1
;with myTable as (
    select 
     dateadd(yy,[Year]-1900,0) + dateadd(mm,[Month]-1,0) YearMonth, 
     Title, 
     Units, 
     Rank 
    from 
     aTable 
), 
results as (

    select 
     YearMonth, 
     Title, 
     Units, 
     [Rank] 
    from 
     myTable 
    where 
     YearMonth = dateadd(m,datediff(m,0,getdate()),0) and 
     Rank <= 5 
    union all 
    select 
     b.YearMonth, 
     b.Title, 
     b.Units, 
     0 Rank 
    from 
     myTable b 
     join results a on 
      b.Title = a.Title and 
      b.YearMonth = dateadd(m,-1,a.YearMonth) and 
      b.Rank <=5 
) 
select 
    max(YearMonth), 
    Title, 
    sum(Units) Units, 
    max(Rank) Rank, 
    count(*) MonthsInTop5 
from 
    results 
group by 
    Title 
order by 
    Rank Desc 
+0

OP要求连续5个月的计数,而不是总数。 –

+0

这很好,但就像山羊说的那样,它显示前5名的总月数,而不是最后的连续数。 – Metaphor

+0

答案将使用递归CTE。 –