SQL选择行,因为它们包含在给定年份的TOP中

时间:2016-10-26 20:07:57

标签: sql sql-server conditional-statements

我试图选择前几年'今年最畅销产品的数据,看看它们是如何随着时间的推移而完成的。

我目前有类似的东西:

u = pd.Series(t[s].values, index=s.index)

它为我提供了本年度的数据,但我不确定如何为前几年同样的前10名提取数据,因为今年的前十名可能与前几年有所不同#&# 39;前10名。

我想知道是否有办法按照以下方式做某事:

SELECT TOP 10 * 
WHERE Table.Year = 2016
ORDER BY Table.Transactions DESC 

除了显然我不知道该替代括号内的条件。

任何建议都将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:1)

你想要这个吗?

SELECT *  
From Table
WHERE Table.Year = 2015 
AND ID IN (
    SELECT TOP 10 ID
    FROM Table
    WHERE Table.Year = 2016 
    ORDER BY Table.Transactions DESC
)
ORDER BY Table.Transactions DESC 

答案 1 :(得分:1)

使用窗口功能:

select t.*
from (select t.*,
             row_number() over (partition by year order by transactions desc) as seqnum
      from t
     ) t
where seqnum <=  10;

另一种有趣的方式是使用cross apply

select t.*
from (select 2015 as yyyy union all select 2016) y cross apply
     (select top 10 t.*
      from t
      where t.year = y.yyyy
      order by transactions desc
     ) t;

您可以使用子查询(select distinct year from t) y

,而不是明确列出年份

答案 2 :(得分:0)

注意ID应该是一些像PK

这样的唯一值
SELECT * 
FROM YourTable
WHERE YourTable.Year = 2015
AND ID IN
(SELECT TOP 10 ID 
WHERE Table.Year = 2016
ORDER BY Table.Transactions DESC)

答案 3 :(得分:0)

select      *

from       (select      t.*
                       ,dense_rank () over (partition by t.year order by t.transactions desc)   as dr

            from        t
            ) t

where       t.dr <= 10

order by    t.year
           ,t.dr
;