SQL-запрос для поиска первого, второго и третьего наибольшего числа - PullRequest
4 голосов
/ 21 августа 2009

Что такое пример запроса для получения первого, второго и третьего по величине числа из таблицы базы данных с использованием SQL Server?

Ответы [ 7 ]

9 голосов
/ 21 августа 2009

Вы можете отсортировать по значению по убыванию и взять верхний 3.

SELECT TOP 3 YourVal FROM YourTable ORDER BY YourVal DESC
2 голосов
/ 21 августа 2009

Или, если вы хотите, чтобы каждый результат был отдельным,

первое число:

SELECT TOP 1 YourVal FROM YourTable ORDER BY YourVal DESC

второй номер:

SELECT TOP 1 YourVal FROM YourTable 
WHERE YourVal not in (SELECT TOP 1 YourVal FROM YourTable ORDER BY YourVal DESC)
ORDER BY YourVal DESC

третье число:

SELECT TOP 1 YourVal FROM YourTable 
WHERE YourVal not in (SELECT TOP 2 YourVal FROM YourTable ORDER BY YourVal DESC)
ORDER BY YourVal DESC

при условии, что YourVal уникален


РЕДАКТИРОВАТЬ: после комментария ОП

чтобы получить n-е значение, выберите ТОП 1, которого нет в ТОПе (n-1), поэтому пятый может быть выбран:

SELECT TOP 1 YourVal FROM YourTable 
WHERE YourVal not in (SELECT TOP 4 YourVal FROM YourTable ORDER BY YourVal DESC)
ORDER BY YourVal DESC
1 голос
/ 08 октября 2012

В некоторых пакетах СУБД команда top может не работать. Тогда как это сделать? Предположим, нам нужно найти третью по величине зарплату в таблице сотрудников. Таким образом, мы выбираем отличную зарплату из таблицы в порядке убывания:

select distinct salary from employee order by salary desc

Теперь среди выбранных зарплат нам нужны 3 верхние зарплаты, для этого пишем:

select salary from (select distinct salary from employee order by salary desc) where rownum<=3 order by salary

Это дает 3 верхних зарплаты в порядке возрастания. Это делает третью по величине зарплату, чтобы перейти на первую позицию. Теперь у нас есть конечная задача печати 3-го по величине числа.

select salary from (select salary from (select distinct salary from employee order by salary desc) where rownum<=3 order by salary) where rownum=1

Это дает третье по величине число. Для любой ошибки в запросе, пожалуйста, дайте мне знать. В основном, чтобы получить n-е наибольшее число, мы можем переписать приведенный выше запрос как

select salary from (select salary from (select distinct salary from employee order by salary desc) where rownum<=**n** order by salary) where rownum=1
1 голос
/ 21 августа 2009

Sudhakar,

Для некоторых из этих вопросов может быть проще использовать ROW_NUMBER () или DENSE_RANK (). Например, чтобы найти YourVal и другие столбцы из пятой строки в порядке YourVal DESC:

WITH TRanked AS (
  SELECT *,
    ROW_NUMBER() OVER (
      ORDER BY YourVal DESC, yourPrimaryKey
    ) AS rk
)
  SELECT YourVal, otherColumns
  FROM TRanked
  WHERE rk = 5;

Если вы хотите, чтобы все строки имели пятое по величине значение YourVal, просто измените ROW_NUMBER () на DENSE_RANK ().

Одно действительно большое преимущество этих функций заключается в том, что вы можете немедленно изменить запрос "nth наивысший YourVal" на запрос "nth наибольший YourVal для каждого другогоColumn " просто добавив PARTITION BY otherColumn к предложению OVER.

1 голос
/ 21 августа 2009

Предложенный SELECT TOP n ... ORDER BY key будет работать, но вам нужно учитывать тот факт, что вы можете получить неожиданные результаты, если столбец, по которому вы сортируете, не является уникальным. Больше информации по теме здесь .

0 голосов
/ 14 февраля 2014

Это работает префект!

select top 1 * from Employees where EmpId in 
(
    select top 3 EmpId from Employees order by EmpId
) order by EmpId desc;

Если вы хотите получить 2-е, 3-е или 4-е место, просто измените top3 на соответствующее число.

0 голосов
/ 21 августа 2009

Если у вас есть таблица с именем Orders и 3 столбцами Id, ProductId и Количество, то для получения трех самых высоких количеств ваш запрос будет выглядеть так:

SELECT TOP 3 [Id], [ProductId], [Quantity] FROM [Orders] ORDER BY [Quantity] DESC

или если вы просто хотите столбец количества:

SELECT TOP 3 [Quantity] FROM [Orders] ORDER BY [Quantity] DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...