30 ответов:
использовать
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
Номер Строки :
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
попробуй такое
SELECT TOP 1 salary FROM ( SELECT TOP 3 salary FROM employees ORDER BY salary DESC) AS emp ORDER BY salary ASCдля 3 можно заменить любое значение...
если вы хотите оптимизировать способ использования средств
TOPКлючевое слово, поэтому запрос nth max и min salaries выглядит следующим образом:N минимальная зарплата:
SELECT MIN(EmpSalary) FROM Salary WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC)например: 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)например: 3 максимальная зарплата:
SELECT MAX(EmpSalary) FROM Salary WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
слишком просто, если вы используете подзапрос!
SELECT MIN(EmpSalary) from ( SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3 );вы можете здесь просто изменить N-е значение после ограничения предела.
здесь в этом подзапросе выберите EmpSalary из Employee Order BY EmpSalary DESC Limit 3; вернет верхние 3 зарплаты сотрудников. Из результата мы выберем минимальную зарплату, используя команду MIN, чтобы получить 3-ю верхнюю зарплату сотрудника.
третья или N-я максимальная зарплата из таблицы зарплат без использования подзапроса
select salary from salary ORDER BY salary DESC OFFSET N-1 ROWS FETCH NEXT 1 ROWS ONLYдля 3-й высшей зарплаты поставьте 2 вместо N-1
замените N своим максимальным числом
SELECT * FROM Employee Emp1 WHERE (N-1) = ( SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > Emp1.Salary)объяснение
запрос выше может быть довольно запутанным, если вы не видели ничего подобного раньше-внутренний запрос-это то, что называется коррелированным подзапросом, потому что внутренний запрос (подзапрос) использует значение из внешнего запроса (в данном случае таблицу Emp1) в предложении IT's WHERE.
и источник
SELECT Salary,EmpName FROM ( SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE ) tbl WHERE Rno=3
Способ 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
в 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 ().
обратитесь к следующему запросу для получения N-й самой высокой зарплаты. Таким образом, вы получаете N-ю самую высокую зарплату в MYSQL. Если вы хотите получить N-ю самую низкую зарплату, вам нужно заменить DESC на ASC в запросе.
declare @maxNthSal as nvarchar(20) SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC print @maxNthSal
Это один из популярных вопросов в любом интервью SQL. Я буду записывать разные запросы, чтобы узнать N-е наибольшее значение столбца.
Я создал таблицу с именем "Emloyee", запустив приведенный ниже скрипт.
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)теперь мы узнаем 3rd highest 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
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-ю самую высокую зарплату
SELECT MIN(COLUMN_NAME) FROM ( SELECT DISTINCT TOP 3 COLUMN_NAME FROM TABLE_NAME ORDER BY COLUMN_NAME DESC ) AS 'COLUMN_NAME'
--N-я самая высокая зарплата
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 )
С помощью подзапроса:
SELECT salary from (SELECT rownum ID, EmpSalary salary from (SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC) where ID = nth)
оптимизированный способ: вместо подзапроса просто используйте limit.
select distinct salary from employee order by salary desc limit nth, 1;смотрите синтаксис ограничения здесь http://www.mysqltutorial.org/mysql-limit.aspx
попробуйте этот запрос
SELECT DISTINCT salary FROM emp E WHERE &no =(SELECT COUNT(DISTINCT salary) FROM emp WHERE E.salary <= salary)Put n= какое значение вы хотите
set @n = $n SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
тестируемое решение 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);
чтобы получить третье по величине значение из таблицы
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
запрос
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
еще один способ найти последние самые высокие данные на основе даты
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)
вы можете попробовать это:
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
показ всех 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
попробуйте этот...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
select Min(salary) from ( select salary from employees order by salary desc) t where rownum<=3;для 2-й самой высокой зарплаты измените 3 на 2 в приведенном выше запросе и для N-й самой высокой зарплаты на N, где N = 1,2,3,4....

Comments