给定一个包含多行int字段和相同标识符的表,是否可以从表中返回第二个最大值和第二个最小值。
表格由
组成ID | number
------------------------
1 | 10
1 | 11
1 | 13
1 | 14
1 | 15
1 | 16
最终结果将是
ID | nMin | nMax
--------------------------------
1 | 11 | 15
答案 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