第二个最大值和最小值

时间:2011-12-08 20:02:54

标签: sql sql-server-2008

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

表格由

组成
ID      |   number
------------------------
1       |     10
1       |     11
1       |     13
1       |     14
1       |     15
1       |     16

最终结果将是

ID      |   nMin    |   nMax
--------------------------------
1       |     11    |    15

6 个答案:

答案 0 :(得分: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

max只是挑出一个非空值;您可以将其替换为min甚至avg,但不会影响结果。

答案 1 :(得分:1)

这会有效,但请注意:

SELECT Id, number
INTO #T
FROM (
  SELECT 1 ID, 10 number
  UNION
  SELECT 1 ID, 10 number
  UNION
  SELECT 1 ID, 11 number
  UNION
  SELECT 1 ID, 13 number
  UNION
  SELECT 1 ID, 14 number
  UNION
  SELECT 1 ID, 15 number
  UNION
  SELECT 1 ID, 16 number
) U;

WITH EX AS (
  SELECT Id, MIN(number) MinNumber, MAX(number) MaxNumber
  FROM #T
  GROUP BY Id
)
SELECT #T.Id, MIN(number) nMin, MAX(number) nMax
FROM #T INNER JOIN
     EX ON #T.Id = EX.Id
WHERE #T.number <> MinNumber AND #T.number <> MaxNumber
GROUP BY #T.Id

DROP TABLE #T;

如果您有两个MAX值相同的值,则会选择它们。因此,根据您的数据呈现方式,您可能正在失去正确的结果。

答案 2 :(得分:1)

您可以使用以下方法选择下一个最小值:

SELECT MAX(Number)
FROM
(
  SELECT  top 2 (Number) 
   FROM table1 t1 
   WHERE ID = {MyNumber}
   order by Number
)a

仅当您可以使用where子句

限制内部查询时,它才有效

答案 3 :(得分:0)

这将是一个更好的方法。我很快把它们放在一起,但是如果你能把这两个查询结合起来,你就能得到你想要的东西。

select *
from
(
    select
        myID,
        myNumber,
        row_number() over (order by myID) as myRowNumber
    from MyTable
) x
where x.myRowNumber = 2

select *
from
(
    select
        myID,
        myNumber,
        row_number() over (order by myID desc) as myRowNumber
    from MyTable
) y
where x.myRowNumber = 2

答案 4 :(得分:0)

让表名为tblName。 从tblName中选择max(number),其中number不在(从tblName中选择max(number));

相同的min,只需用最小值替换max。

答案 5 :(得分:-1)

正如我自己今天所知,解决方案是使用LIMIT。您可以对结果进行排序,以便最高值位于顶部,并将结果限制为2.然后选择该子选择并按顺序排列,只选择第一个。

SELECT somefield FROM (
SELECT somefield from table
ORDER BY somefield DESC LIMIT 2) 
ORDER BY somefield ASC LIMIT 1