Вторые максимальные и минимальные значения - PullRequest
5 голосов
/ 09 декабря 2011

При наличии таблицы с несколькими строками поля int и одним и тем же идентификатором можно вернуть 2-е максимальное и 2-е минимальное значение из таблицы.

Таблица состоит из

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

Окончательный результат будет

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

Ответы [ 6 ]

9 голосов
/ 09 декабря 2011

Вы можете использовать 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 голос
/ 12 июля 2017

Вы можете выбрать следующее минимальное значение, используя следующий метод:

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

Это работает, только если вы можете ограничить внутренний запрос с помощью предложения where

1 голос
/ 09 декабря 2011

Это будет работать, но смотрите предостережения:

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 значения, которые имеют одинаковое значение, это не заберет их.Таким образом, в зависимости от того, как представлены ваши данные, вы можете потерять нужный результат.

0 голосов
/ 20 ноября 2017

пусть имя таблицы будет tblName.выберите max (число) из tblName, где число не входит (выберите max (число) из tblName);

то же самое для min, просто замените max на min.

0 голосов
/ 09 декабря 2011

Это был бы лучший способ.Я быстро соединил это, но если вы сможете объединить два запроса, вы получите именно то, что искали.

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
0 голосов
/ 09 декабря 2011

Как я сам узнал только сегодня, решение заключается в использовании LIMIT.Вы упорядочиваете результаты так, чтобы самые высокие значения находились сверху, и ограничивает результат до 2. Затем вы выбираете этот подвыбор и упорядочиваете его в обратном порядке и берете только первое.

SELECT somefield FROM (
SELECT somefield from table
ORDER BY somefield DESC LIMIT 2) 
ORDER BY somefield ASC LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...