web-dev-qa-db-ja.com

TOPとサブクエリを使用せずにテーブルからn番目に高い給与を取得するにはどうすればよいですか?

最近のインタビューで、TOPやサブクエリを使用せずに、テーブルからn番目に高い給与を取得する必要があるクエリを作成するように求められました。

それを実装する唯一の方法がTOPとサブクエリの両方を使用するので、私は完全に混乱しました。

親切にその解決策を提供してください。

前もって感謝します。

8
HotTester

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でも使用できるものがあります-例:結果を同じサイズのn個のグループに(できるだけ近くに)分割するNTILEがあるので、たとえば、次のように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%」グループです。

10
marc_s
;with cte as(
Select salary,
row_number() over (order by salary desc) as rn
from salaries
)

select salary 
from cte 
where rn=@n

(または、n番目に高い個別の給与額が必要な場合は、dense_rankの代わりにrow_numberを使用します)

11
Martin Smith
Select  * 
From    Employee E1 
Where
N = (Select Count(Distinct(E2.Salary)) From Employee E2 Where E2.Salary >= E1.Salary)
5
Venkatesh
with cte as(
select VendorId,IncomeDay,IncomeAmount,
Row_Number() over ( order by IncomeAmount desc) as RowNumber
 from DailyIncome 
 )

 select * from cte
 where RowNumber=2
3
abc

5番目の最小サルエンプテーブルを表示します。

SELECT * FROM (SELECT Dense_Rank () Over (ORDER BY Sal ASC) AS Rnk, Emp.* FROM Emp) WHERE
Rnk=5;
2

の重複エントリがある場合

30,000、
23,000、
23,000、
15,000、
14,800

その場合、上記で選択したクエリは正しい出力を返しません。

以下のように正しいクエリを見つけてください。

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
Harshal S

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

これを試して。

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

次のように簡単に行うことができます。

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

ただし、N番目に高い場合は、CTE(共通テーブル式)を使用する必要があります。

1
manish

これを試して。 CTEを使用すると、n番目のランクのアイテムを簡単に見つけることができます**

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

****

1
ullas kishan

6-2番目に高い給与を書く方法.. **

1.select * from employee order by Salary desc offset 1 rows fetch next 1 row only

2.従業員からmax(salary)を選択します。salary<(従業員からmax(salary)を選択します)

3.従業員からMAX(Salary)を選択しますWHERE Salary NOT IN(従業員からMAX(Salary)を選択します);

4.従業員e1、従業員e2からmax(e1.salary)を選択します。ここでe1.salary

5.with cte as(SELECT *、ROW_NUMBER()OVER(order by SALARY desc)AS ROWNUM FROM EMPLOYEE as rn)select * From cte where ROWNUM = 2

6.従業員e1、従業員e2からmax(e1.Salary)を選択します。ここで、e1.Salary

0
Yamana Harish

N番目に高い給与を見つけるために、一意の給与のみを考慮しています.2番目に高い給与は、それより高い給与がないことを意味し、2番目に高い給与は、それより高い給与が1つだけであることを意味し、3番目に高い給与は、2つの給与がそれより高いことを意味します。最高の給与は、N-1の給与がそれよりも高いことを意味します。さて、あなたはページネーション機能を提供する[〜#〜] limit [〜#〜]キーワードを使用することによって行うことができます。あなたは以下のように行うことができます:

SELECT salary FROM Employee ORDER BY salary DESC LIMIT N-1, 1 

例:サブクエリなしのMySQLで2番目に高い給与:

SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1,1
0
PyDevSRS
 SELECT salery,name
 FROM employ
 ORDER BY salery DESC limit 1, OFFSET n
with CTE_name (salary,name)
AS
( row_num() over (order by desc salary) as num from tablename )
select salary, name from CTE_name where num =1;

これはOracleで機能します

0
mickey