最近のインタビューで、TOPやサブクエリを使用せずに、テーブルからn番目に高い給与を取得する必要があるクエリを作成するように求められました。
それを実装する唯一の方法がTOPとサブクエリの両方を使用するので、私は完全に混乱しました。
親切にその解決策を提供してください。
前もって感謝します。
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%」グループです。
;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
を使用します)
Select *
From Employee E1
Where
N = (Select Count(Distinct(E2.Salary)) From Employee E2 Where E2.Salary >= E1.Salary)
with cte as(
select VendorId,IncomeDay,IncomeAmount,
Row_Number() over ( order by IncomeAmount desc) as RowNumber
from DailyIncome
)
select * from cte
where RowNumber=2
5番目の最小サルエンプテーブルを表示します。
SELECT * FROM (SELECT Dense_Rank () Over (ORDER BY Sal ASC) AS Rnk, Emp.* FROM Emp) WHERE
Rnk=5;
の重複エントリがある場合
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
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;
これを試して。
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(共通テーブル式)を使用する必要があります。
これを試して。 CTEを使用すると、n番目のランクのアイテムを簡単に見つけることができます**
with result AS
(
SELECT *,dense_rank() over( order by Salary) as ranks FROM Employee
)
select *from RESULT Where ranks = 2
****
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
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
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で機能します