Как найти третью или N-ю максимальную зарплату из таблицы зарплат?



Как найти third or nth максимальная зарплата из оклада table(EmpID,EmpName,EmpSalary) оптимизированным способом?

962   30  

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 в запросе. nth highest salary

SELECT EmpSalary 
FROM salary_table 
GROUP BY EmpSalary 
ORDER BY EmpSalary DESC LIMIT n-1, 1;
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
select min(salary) 
from (select salary 
      from employee 
      where rownum < n+1 
      order by salary 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

    Ничего не найдено.