第二个最大值和最小值

Mar*_*uth 5 sql sql-server-2008

给定一个具有多行int字段和相同标识符的表,是否可以从表中返回第二个最大值和第二个最小值.

一张桌子由

ID      |   number
------------------------
1       |     10
1       |     11
1       |     13
1       |     14
1       |     15
1       |     16
Run Code Online (Sandbox Code Playgroud)

最终结果将是

ID      |   nMin    |   nMax
--------------------------------
1       |     11    |    15
Run Code Online (Sandbox Code Playgroud)

And*_*mar 9

您可以使用row_number每个ID分配排名.然后你可以group by id选择你所追求的排名行.以下示例选择第二低和第三高:

select  id
,       max(case when rnAsc = 2 then number end) as SecondLowest
,       max(case when rnDesc = 3 then number end) as ThirdHighest
from    (
        select  ID
        ,       row_number() over (partition by ID order by number) as rnAsc
        ,       row_number() over (partition by ID order by number desc) as rnDesc
        ) as SubQueryAlias
group by
        id
Run Code Online (Sandbox Code Playgroud)

max只是挑选出一个非空值; 你可以用它来代替,min甚至avg不会影响结果.