Как получить n-ую самую высокую зарплату из таблицы без использования TOP и подзапроса? - PullRequest
8 голосов
/ 05 сентября 2010

Недавно в одном из интервью меня попросили написать запрос, в котором я должен был получить n-ю самую высокую зарплату из таблицы без использования TOP и каких-либо подзапросов?

Я был совершенно сбит с толку, как единственный известный мне способ.для его реализации используются как TOP, так и подзапрос.

Пожалуйста, предоставьте свое решение.

Заранее спасибо.

Ответы [ 15 ]

10 голосов
/ 05 сентября 2010

Попробуйте CTE - общее табличное выражение:

WITH Salaries AS
(
    SELECT 
       SalaryAmount, ROW_NUMBER() OVER(ORDER BY SalaryAmount DESC) AS 'RowNum'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   RowNum <= 5

Получает 5 лучших зарплат в порядке убывания - вы можете поиграть со значением RowNumn и получить любой фрагмент из списка зарплат.

В SQL Server также доступны другие функции ранжирования , которые также могут использоваться - например, есть NTILE, который разделит ваши результаты на n групп одинакового размера (как можно ближе), так что вы можете, например, создайте 10 групп, подобных этой:

WITH Salaries AS
(
    SELECT 
       SalaryAmount, NTILE(10) OVER(ORDER BY SalaryAmount DESC) AS 'NTile'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   NTile = 1

Это разделит вашу зарплату на 10 групп одинакового размера, а группа с NTile=1 будет группой «ТОП 10%».

9 голосов
/ 05 сентября 2010
;with cte as(
Select salary,
row_number() over (order by salary desc) as rn
from salaries
)

select salary 
from cte 
where rn=@n

(или используйте dense_rank вместо row_number, если вы хотите n-ую наибольшую отдельную сумму заработной платы)

5 голосов
/ 08 марта 2011
Select  * 
From    Employee E1 
Where
N = (Select Count(Distinct(E2.Salary)) From Employee E2 Where E2.Salary >= E1.Salary)
3 голосов
/ 06 декабря 2012
with cte as(
select VendorId,IncomeDay,IncomeAmount,
Row_Number() over ( order by IncomeAmount desc) as RowNumber
 from DailyIncome 
 )

 select * from cte
 where RowNumber=2
1 голос
/ 12 октября 2016

Чтобы найти N-ую самую высокую зарплату:
Имя таблицы - Emp

        emplyee_id     salary
             1          2000
             2          3000
             3          5000
             4          8000
             5          7000
             6          2000
             7          1000

SQL-запрос -> здесь N самая высокая зарплата из найденных:

select salary from (select salary from Emp order by salary DESC LIMIT N) AS E order by ASC LIMIT 1;
1 голос
/ 10 августа 2016

Дисплей 5-й таблицы мин Sal Emp.

SELECT * FROM (SELECT Dense_Rank () Over (ORDER BY Sal ASC) AS Rnk, Emp.* FROM Emp) WHERE
Rnk=5;
1 голос
/ 08 апреля 2016

попробуйте это.Можно легко найти предметы n-го ранга, используя CTE **

with result AS
( 
 SELECT  *,dense_rank() over( order by Salary) as ranks FROM Employee
) 
select *from RESULT Where ranks = 2

**

1 голос
/ 31 декабря 2013

Если есть повторяющиеся записи

30 000,
23 000,
23 000,
15 000,
14800

, тогда указанный выше запрос не вернет правильный вывод.

найти правильный запрос, как показано ниже:

with salaries as
(
    select Salary,DENSE_RANK() over (order by salary desc) as 'Dense' 
    from Table_1
)
select distinct salary from salaries
where dense=3
1 голос
/ 15 мая 2013

Это может быть просто сделано следующим образом для второго по величине -

Select MAX(Salary) from employer where Salary NOT IN(Select MAX(Salary) from employer);

Но для N-го максимума мы должны использовать CTE (Common Table Expression).

1 голос
/ 09 января 2013

Попробуйте это.

 SELECT * FROM
  (SELECT Salary,
    rownum AS roworder
  FROM (select distinct Salary from employer)
  ORDER BY Salary
  )
 where roworder = 6
  ;
...