我正在使用SSMS v17.6,我需要为每个唯一的“ ID”和“ FRUIT”收集前三行,其最高值如下所示。
示例数据
ID FRUIT OTHER_ID VALUE
GG-1 APPLE 25432 100
GG-1 APPLE 37586 200
GG-1 APPLE 33614 400
GG-1 APPLE 70776 500
GG-1 APPLE 52102 600
GG-2 BANANA 33745 150
GG-2 BANANA 44823 250
GG-2 BANANA 88313 350
GG-2 BANANA 25181 450
GG-2 BANANA 65301 650
结果(前3名)
ID FRUIT OTHER_ID VALUE
GG-1 APPLE 33614 400
GG-1 APPLE 70776 500
GG-1 APPLE 52102 600
GG-2 BANANA 88313 350
GG-2 BANANA 25181 450
GG-2 BANANA 65301 650
数据不限于此示例中显示的两个水果和ID,而是每个水果都有唯一的ID。我认为可以仅基于ID本身来完成。在我看来SELECT TOP(n)
无效,Order By ... LIMIT n
也许某种等级函数可以做到这一点,但我不确定这里需要的术语。
答案 0 :(得分:1)
使用row_number()
:
select t.*
from (select t.*,
row_number() over (partition by id, fruit order by VALUE desc) as seqnum
from t
) t
where seqnum <= 3;