Как найти third or nth
максимальную зарплату от зарплаты table(EmpID,EmpName,EmpSalary)
Оптимизированным способом?
Как найти третью или девятую максимальную зарплату из таблицы зарплаты?
Ответ 1
Используйте ROW_NUMBER
(если вы хотите один) или DENSE_RANK
(для всех связанных строк):
WITH CTE AS
(
SELECT EmpID, EmpName, EmpSalary,
RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM dbo.Salary
)
SELECT EmpID, EmpName, EmpSalary
FROM CTE
WHERE RN = @NthRow
Ответ 2
Номер строки:
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,ROW_NUMBER() OVER(ORDER BY Salary) As RowNum
FROM EMPLOYEE
) As A
WHERE A.RowNum IN (2,3)
Sub Query:
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary
)
Верхнее ключевое слово:
SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP n salary
FROM employee
ORDER BY salary DESC
) a
ORDER BY salary
Ответ 3
Попробуйте это
SELECT TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
Для 3 вы можете заменить любое значение...
Ответ 4
Если вы хотите оптимизировать способ, используйте ключевое слово TOP
, поэтому n-й запрос максимальной и минимальной зарплаты выполняется следующим образом, но запросы выглядят хитро, как в обратном порядке, с использованием имен агрегатных функций:
N максимальная зарплата:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC)
для Ex: 3 максимальная зарплата:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
N минимальная зарплата:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)
для Ex: 3 минимальная зарплата:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
Ответ 5
Слишком просто, если вы используете sub-запрос!
SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);
Здесь вы можете просто изменить n-е значение после ограничения LIMIT.
Здесь в этом Sub-запрос выберите EmpSalary из Employee Order by EmpSalary DESC Limit 3; вернет верхнюю 3 зарплаты сотрудников. Из результата мы выберем минимальную зарплату с помощью команды MIN, чтобы получить 3-й ТОП-зарплату сотрудника.
Ответ 6
Замените N своим максимальным числом
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
Объяснение
Вышеприведенный запрос может быть довольно запутанным, если вы еще не видели ничего подобного - внутренний запрос - это то, что называется коррелированным подзапросом, потому что внутренний запрос (подзапрос) использует значение из внешнего запроса (в этом случае таблицу Emp1) в своем предложении WHERE.
И Источник
Ответ 7
Третья или n-я максимальная зарплата из таблицы зарплаты без использования подзапроса
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
За 3-ей самую высокую зарплату поставьте 2 вместо N-1
Ответ 8
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
Ответ 9
Обратитесь к следующему запросу, чтобы получить самую высокую зарплату. Таким образом, вы получаете nth самую высокую зарплату в MYSQL. Если вы хотите получить первую минимальную зарплату, вам нужно будет заменить DESC по ASC в запросе.
Ответ 10
Способ 1:
SELECT TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
Способ 2:
Select EmpName,salary from
(
select EmpName,salary ,Row_Number() over(order by salary desc) as rowid
from EmpTbl)
as a where rowid=3
Ответ 11
В 2008 году мы можем использовать ROW_NUMBER() OVER (ORDER BY EmpSalary DESC), чтобы получить ранг без связей, которые мы можем использовать.
Например, мы можем получить 8-е место по этому пути или изменить @N на что-то другое или использовать его в качестве параметра в функции, если хотите.
DECLARE @N INT = 8;
WITH rankedSalaries AS
(
SELECT
EmpID
,EmpName
,EmpSalary,
,RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM salary
)
SELECT
EmpID
,EmpName
,EmpSalary
FROM rankedSalaries
WHERE RN = @N;
В SQL Server 2012, как вы знаете, это выполняется более интуитивно с помощью LAG().
Ответ 12
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Ответ 13
Это один из популярных вопросов в любом интервью SQL. Я собираюсь записать различные запросы, чтобы узнать n-е наивысшее значение столбца.
Я создал таблицу с именем "Emloyee", выполнив ниже script.
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
Теперь я собираюсь вставить 8 строк в эту таблицу, выполнив ниже инструкции insert.
insert into Employee values(1,'Neeraj',45000)
insert into Employee values(2,'Ankit',5000)
insert into Employee values(3,'Akshay',6000)
insert into Employee values(4,'Ramesh',7600)
insert into Employee values(5,'Vikas',4000)
insert into Employee values(7,'Neha',8500)
insert into Employee values(8,'Shivika',4500)
insert into Employee values(9,'Tarun',9500)
Теперь мы найдем 3-й самый высокий Basic_sal из приведенной выше таблицы, используя разные запросы. Я выполнил нижний запрос в студии управления, а ниже - результат.
select * from Employee order by Basic_Sal desc
В приведенном выше изображении мы можем видеть, что 3-я высшая базовая зарплата будет 8500. Я пишу 3 разных способа сделать то же самое. Запустив все три упомянутых ниже запроса, мы получим тот же результат, то есть 8500.
Первый способ: - использование функции номера строки
select Ename,Basic_sal
from(
select Ename,Basic_Sal,ROW_NUMBER() over (order by Basic_Sal desc) as rowid from Employee
)A
where rowid=2
Ответ 14
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
Ответ 15
Select TOP 1 Salary as '3rd Highest Salary' from (SELECT DISTINCT TOP 3 Salary from Employee ORDER BY Salary DESC) a ORDER BY Salary ASC;
Я показываю 3-ю самую высокую зарплату
Ответ 16
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
Ответ 17
- nth самая высокая зарплата
select *
from (select lstName, salary, row_number() over( order by salary desc) as rn
from employee) tmp
where rn = 2
- (nth -1) высшая зарплата
select *
from employee e1
where 1 = (select count(distinct salary)
from employee e2
where e2.Salary > e1.Salary )
Ответ 18
Оптимизированный способ: вместо подзапроса просто используйте лимит.
select distinct salary from employee order by salary desc limit nth, 1;
См. здесь синтаксис ограничений http://www.mysqltutorial.org/mysql-limit.aspx
Ответ 19
Чтобы получить третье наибольшее значение из таблицы
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Ответ 20
В подзапросе:
SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
Ответ 21
Попробуйте этот запрос
SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary)
FROM emp WHERE E.salary <= salary)
Положите n = какое значение вы хотите
Ответ 22
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
Ответ 23
Решение для тестирования MySQL, предположим, что N = 4:
select min(CustomerID) from (SELECT distinct CustomerID FROM Customers order by CustomerID desc LIMIT 4) as A;
Другой пример:
select min(country) from (SELECT distinct country FROM Customers order by country desc limit 3);
Ответ 24
Попробуйте этот код: -
SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
Ответ 25
Чтобы запросить nth highest bonus
, скажем n=10
, используя AdventureWorks2012, попробуйте следующий код
USE AdventureWorks2012;
GO
SELECT * FROM Sales.SalesPerson;
GO
DECLARE @grade INT;
SET @grade = 10;
SELECT MIN(Bonus)
FROM (SELECT TOP (@grade) Bonus FROM (SELECT DISTINCT(Bonus) FROM Sales.SalesPerson) AS a ORDER BY Bonus DESC) AS g
Ответ 26
другой способ найти последние самые высокие данные на основе даты
SELECT A.JID,A.EntryDate,RefundDate,Comments,Refund, ActionBy FROM (
(select JID, Max(EntryDate) AS EntryDate from refundrequested GROUP BY JID) A
Inner JOIN (SELECT JID,ENTRYDATE,refundDate,Comments,refund,ActionBy from refundrequested) B
ON A.JID=B.JID AND A.EntryDate = B.EntryDate)
Ответ 27
//вы можете найти n-й зарплату из таблицы. Если вы хотите получить 2-ую самую высокую зарплату, тогда поместите n = 2, если 3-й hs, а затем n = 3, как таковой..
SELECT * FROM tablename t1
WHERE (N-1) = (SELECT COUNT(DISTINCT(t2.Salary))
FROM tablename t2
WHERE t2.Salary > t1.Salary)
Ответ 28
Вы можете попробовать следующее:
select top(1) EXPORT_NO
from DC_HDR
order by CASE when (ROW_NUMBER() over(order by EXPORT_NO desc))=3 then EXPORT_NO else 0 end desc
Ответ 29
select min(salary)
from (select salary
from employee
where rownum < n+1
order by salary desc);
Ответ 30
Показав всю 3-ю самую высокую зарплату:
select * from emp where sal=
(SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1) ;
Показана только 3-я самая высокая зарплата:
SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1