最適化された方法で給与から3 番目または n番目の最高給与を見つける方法は?table(EmpID, EmpName, EmpSalary)
56 に答える
行番号 :
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)
サブクエリ:
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
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 TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
3 の場合、任意の値を置き換えることができます...
最適化方法が必要な場合はTOP
、キーワードを使用することを意味します。そのため、n 番目の最大給与と最小給与は次のようにクエリされますが、クエリは集計関数名を使用して逆順のようにトリッキーに見えます。
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
);
ここでは、LIMIT 制約の後の n 番目の値を変更するだけです。
このサブクエリでは、EmpSalary DESC Limit 3 による従業員の注文から EmpSalary を選択します。Employees の上位 3 つの給与を返します。結果から、MIN コマンドを使用して最低給与を選択し、従業員の 3 番目のトップ給与を取得します。
N を最大数に置き換えます
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
説明
上記のクエリは、これまで見たことがない場合は非常に混乱する可能性があります。内部クエリ (サブクエリ) は外部クエリ (この場合は Emp1 テーブル) の値を使用するため、内部クエリは相関サブクエリと呼ばれるものです。 ) WHERE 句で。
そしてソース
サブクエリを使用しない給与テーブルからの 3 番目または n 番目の最高給与
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
3 番目に高い給与の場合、N-1 の代わりに 2 を入れます
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
方法 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
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 )
これは、どの SQL 面接でもよく聞かれる質問の 1 つです。列の n 番目に高い値を見つけるために、さまざまなクエリを書き留めます。
以下のスクリプトを実行して、「Emloyee」という名前のテーブルを作成しました。
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
次に、以下の挿入ステートメントを実行して、このテーブルに 8 行を挿入します。
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)
ここで、さまざまなクエリを使用して、上記のテーブルから 3 番目に高い Basic_sal を見つけます。管理スタジオで以下のクエリを実行しました。以下が結果です。
select * from Employee order by Basic_Sal desc
上の画像では、3 番目に高い基本給が 8500 になることがわかります。同じことを行う 3 つの異なる方法を書いています。以下の 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 salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
このクエリを試す
SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary)
FROM emp WHERE E.salary <= salary)
n= 必要な値を入れてください
SELECT TOP 1 salary FROM ( SELECT TOP n salary FROM employees ORDER BY salary DESC Group By salary ) AS emp ORDER BY salary ASC
(n 番目の最高給与の場合は n)
5 番目に高い給与を検索するには:
Declare @N INT = 5
SELECT Salary FROM Employee
ORDER BY Salary DESC OFFSET @N - 1 ROW
select max(sal)
from emp
where sal > (
select max(sal)
from emp
where sal > (select max(sal) from emp)
);
これを試すことができます:
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 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)
給与が n 番目に高い行
(複数の従業員が同じ給与を受け取ることができると仮定します。つまり、関係が存在する可能性があります)
n番目に高い給与のすべての行が必要な場合
select * from table_name
where salary = (
select distinct(salary) as sal from
table_name order by sal desc
limit n-1, 1
);
n番目に高い給与を持つ最初のk行のみが必要な場合
select * from table_name
where salary = (
select distinct(salary) as sal from
table_name order by sal desc
limit n-1, 1
) limit k; -- you can also apply `order by` in this line
参照
select min(salary)
from (select salary
from employee
where rownum < n+1
order by salary desc);
CTE と FIRST_VALUE 関数を使用して N 番目の最大値を見つけます。-- 5番目の最大給与
;WITH CTE_NTH_SAL AS
(SELECT FIRST_VALUE(ESAL) OVER(ORDER BY ESAL DESC) AS ESAL,
1 AS ID
FROM EMPLOYEE
UNION ALL
SELECT FIRST_VALUE(EMP.ESAL) OVER(ORDER BY EMP.ESAL DESC) AS ESAL,
ID
FROM EMPLOYEE EMP,
(SELECT ESAL,
ID+1 AS ID
FROM CTE_NTH_SAL) CTE_NTH_SAL
WHERE EMP.ESAL<CTE_NTH_SAL.ESAL
AND CTE_NTH_SAL.ID<=5 )
SELECT DISTINCT ESAL
FROM CTE_NTH_SAL
WHERE ID=5
サンプルの結果セットとその他の方法については、ここをクリックしてください
n番目に高い給与の場合..
SELECT DISTINCT Salary
FROM EMP E WHERE
n =(SELECT COUNT(DISTINCT SALARY)
FROM EMP WHERE E.SALARY <= SALARY)
n は必要な最大値、つまり 2,3 など
n番目に高い値の場合
select min(salary)
from (select salary from(select salary from employee order by salary desc)where rownum<=n);
これはテーブル emp から n 番目に高い給与を取得するための mysql クエリです。ここでは、"TOP" の代わりに "LIMIT" を使用します。パラメーター (n-1) は、どの行から開始するかを示し、2 番目のパラメーターは、(n-1) 番目の行から開始して表示する行数を示します。「LIMIT」は、0番目(または1番目)から始まる表示する行数を表す単一のパラメーターも受け入れます。
select distinct * from emp order by sal desc limit (n-1),1;
select * from emp x where &no=(select count(*) from emp y where y.sal>=x.sal);
これにより、ユーザーからの入力が得られ、n番目の最大数が通知されます。オラクルのempテーブルの例を取り上げ、n番目の最大給与従業員情報を表示しました
出力 no の値を入力: 5
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 01-MAY-81 3000 30
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
いいえの値を入力してください: 14
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20