Как найти third or nth
максимальную зарплату из зарплаты table(EmpID,EmpName,EmpSalary)
Оптимизированным способом?
sql
sql-server
sql-server-2008
Каран Ганди
источник
источник
SELECT salary FROM (SELECT salary FROM employee ORDER BY salary DESC FETCH NEXT 3 ROWS ONLY) ORDER BY salary ASC FETCH NEXT 1 ROWS ONLY;
Ответы:
Используйте
ROW_NUMBER
(если вы хотите одну) илиDENSE_RANK
(для всех связанных строк):источник
EmpSalary
столбце. Кроме того, уменьшено по сравнению с чем? Преимущество такогоROW_NUMBER
подхода в том, что его можно использовать..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
. Таким образом, вы можете использовать его для получения групп, но при этом получить доступ к любому его столбцу.Номер строки:
Подзапрос:
Верхнее ключевое слово:
источник
... WHERE (N-1) = (Subquery)...
работает. Подзапрос является коррелированным запросом, поскольку егоWHERE
предложение используетEmp1
из основного запроса. Подзапрос оценивается каждый раз, когда основной запрос просматривает строку. Например, если мы должны найти 3-ю по величине зарплату (N = 3) из (800, 1000, 700, 750), подзапрос для 1-й строки будетSELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
равен 0. Для 4-го значения зарплаты (750)... WHERE Emp2.Salary > 750
будет 2 или N -1, следовательно, эта строка будет возвращена.Попробуй это
На 3 можно заменить любое значение ...
источник
Если вы хотите оптимизировать способ, используйте
TOP
ключевое слово. Таким образом, n-й запрос максимальной и минимальной зарплаты выглядит следующим образом, но запросы выглядят сложными, как в обратном порядке, с использованием имен агрегированных функций:Максимальная зарплата N:
Например: 3 максимальная зарплата:
N минимальная заработная плата:
Например: 3 минимальная зарплата:
источник
Слишком просто, если использовать подзапрос!
Здесь вы можете просто изменить n-е значение после ограничения LIMIT.
Здесь в этом подзапросе Выберите EmpSalary из заказа сотрудника с помощью EmpSalary DESC Limit 3; вернет 3 верхних зарплаты Сотрудников. Из результата мы выберем Минимальную зарплату с помощью команды MIN, чтобы получить 3-ю ТОП-зарплату сотрудника.
источник
Замените N своим максимальным числом
Объяснение
Вышеупомянутый запрос может сбивать с толку, если вы раньше не видели ничего подобного - внутренний запрос - это то, что называется коррелированным подзапросом, потому что внутренний запрос (подзапрос) использует значение из внешнего запроса (в данном случае таблица Emp1 ) в предложении WHERE.
И Источник
источник
... WHERE (N-1) = (Subquery)...
работает. Подзапрос является коррелированным запросом, поскольку егоWHERE
предложение используетEmp1
из основного запроса. Подзапрос оценивается каждый раз, когда основной запрос просматривает строку. Например, если мы должны найти 3-ю по величине зарплату (N = 3) из (800, 1000, 700, 750), подзапрос для 1-й строки будетSELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
равен 0. Для 4-го значения зарплаты (750)... WHERE Emp2.Salary > 750
будет 2 или N -1, следовательно, эта строка будет возвращена.Третья или энная максимальная зарплата из таблицы зарплат без использования подзапроса
Для 3-й по величине зарплаты поставить 2 вместо N-1
источник
источник
Обратитесь к следующему запросу для получения n-й по величине зарплаты. Таким образом, вы получаете n-ю по высоте зарплату в MYSQL. Если вы хотите получить n-ю самую низкую зарплату, вам нужно заменить DESC на ASC в запросе.
источник
источник
Способ 1:
Способ 2:
источник
В 2008 мы можем использовать ROW_NUMBER () OVER (ORDER BY EmpSalary DESC), чтобы получить ранг без связей, которые мы можем использовать.
Например, таким образом мы можем получить 8-е место или изменить @N на что-то другое или использовать его как параметр в функции, если хотите.
В SQL Server 2012, как вы, возможно, знаете, это выполняется более интуитивно с помощью LAG ().
источник
источник
Это один из популярных вопросов в любом собеседовании по SQL. Я собираюсь записать разные запросы, чтобы узнать n-е наибольшее значение столбца.
Я создал таблицу с именем «Emloyee», выполнив приведенный ниже сценарий.
Теперь я собираюсь вставить 8 строк в эту таблицу, выполнив инструкцию вставки ниже.
Теперь мы найдем 3-й по величине Basic_sal из приведенной выше таблицы, используя разные запросы. Я выполнил приведенный ниже запрос в студии управления, и ниже показан результат.
На изображении выше мы можем видеть, что 3-я по величине базовая зарплата будет 8500. Я пишу 3 разных способа сделать то же самое. Выполнив все три указанных ниже запроса, мы получим тот же результат, т.е. 8500.
Первый способ: - Использование функции номера строки
источник
У меня третья по величине зарплата
источник
источник
- самая высокая зарплата
- (n-е -1) самая высокая зарплата
источник
Оптимизированный способ: вместо подзапроса просто используйте limit.
См. Синтаксис ограничения здесь http://www.mysqltutorial.org/mysql-limit.aspx
источник
Чтобы получить третье по величине значение из таблицы
источник
По подзапросу:
источник
Попробуйте этот запрос
Положите n = какое значение вы хотите
источник
источник
Решение, протестированное MySQL, предположим, что N = 4:
Другой пример:
источник
Попробуйте этот код: -
источник
Найдите N-ую самую высокую зарплату из таблицы. Вот способ выполнить эту задачу с помощью функции density_rank ().
DENSE_RANK: 1. DENSE_RANK вычисляет ранг строки в упорядоченной группе строк и возвращает ранг как ЧИСЛО. Ранги представляют собой последовательные целые числа, начинающиеся с 1. 2. Эта функция принимает аргументы как любой числовой тип данных и возвращает ЧИСЛО. 3. В качестве аналитической функции DENSE_RANK вычисляет ранг каждой строки, возвращаемой из запроса, по отношению к другим строкам на основе значений value_exprs в предложении order_by_clause. 4. В приведенном выше запросе ранг возвращается на основе sal таблицы сотрудников. В случае ничьи всем строкам присваивается одинаковый ранг.
источник
В SQL Server 2012+ эффективный способ добиться этого - OFFSET ... FETCH:
источник
Замените n номером n-й по величине зарплатой.
источник
(где n - максимальная зарплата n)
источник
Просто измените значение внутреннего запроса: например, Select Top (2) * from Student_Info order by ClassID desc
Используйте для обеих проблем:
источник
Чтобы запросить
nth highest bonus
, скажемn=10
, с помощью AdventureWorks2012, попробуйте следующий кодисточник