106

最適化された方法で給与から3 番目または n番目の最高給与を見つける方法は?table(EmpID, EmpName, EmpSalary)

4

56 に答える 56

93

行番号 :

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
于 2013-04-26T11:35:00.157 に答える
89

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
于 2013-04-26T11:11:22.087 に答える
67

これを試して

SELECT TOP 1 salary FROM (
   SELECT TOP 3 salary 
   FROM employees 
   ORDER BY salary DESC) AS emp 
ORDER BY salary ASC

3 の場合、任意の値を置き換えることができます...

于 2013-04-26T11:11:27.073 に答える
45

最適化方法が必要な場合は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)
于 2014-07-09T09:22:01.293 に答える
16

サブクエリを使えば簡単すぎる!

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 番目のトップ給与を取得します。

于 2014-08-22T18:58:30.707 に答える
15

N を最大数に置き換えます

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)

説明

上記のクエリは、これまで見たことがない場合は非常に混乱する可能性があります。内部クエリ (サブクエリ) は外部クエリ (この場合は Emp1 テーブル) の値を使用するため、内部クエリは相関サブクエリと呼ばれるものです。 ) WHERE 句で。

そしてソース

于 2013-04-26T11:12:02.970 に答える
13

サブクエリを使用しない給与テーブルからの 3 番目または n 番目の最高給与

select salary from salary
   ORDER   BY salary DESC
   OFFSET  N-1 ROWS
   FETCH NEXT 1 ROWS ONLY

3 番目に高い給与の場合、N-1 の代わりに 2 を入れます

于 2013-10-29T10:48:40.207 に答える
11
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
于 2013-10-11T04:15:01.863 に答える
10
SELECT EmpSalary 
FROM salary_table 
GROUP BY EmpSalary 
ORDER BY EmpSalary DESC LIMIT n-1, 1;
于 2016-05-13T18:07:46.110 に答える
6

方法 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
于 2015-03-09T10:36:36.483 に答える
3
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'
于 2015-09-16T10:40:54.300 に答える
3

--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 )
于 2016-06-21T12:48:26.153 に答える
3

これは、どの 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
于 2014-04-05T15:38:27.680 に答える
2

サブクエリによる:

SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
于 2015-10-29T05:20:06.407 に答える
1

このクエリを試す

SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary) 
FROM emp WHERE E.salary <= salary)

n= 必要な値を入れてください

于 2013-12-02T07:03:23.170 に答える
0
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)

于 2013-05-02T09:49:16.380 に答える
0

5 番目に高い給与を検索するには:

Declare @N INT = 5 
SELECT Salary FROM Employee 
ORDER BY Salary DESC OFFSET @N - 1 ROW
于 2014-01-23T11:26:03.807 に答える
0
select max(sal) 
from emp 
where sal > (
    select max(sal) 
    from emp 
    where sal > (select max(sal) from emp)
);
于 2013-12-18T09:35:32.247 に答える
0

これを試すことができます:

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
于 2014-04-15T05:56:54.337 に答える
0

日付に基づいて最後の最高データを見つける別の方法

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) 
于 2014-01-07T08:02:43.743 に答える
0

給与が 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

参照

于 2022-01-24T11:41:58.670 に答える
0
select min(salary) 
from (select salary 
      from employee 
      where rownum < n+1 
      order by salary desc);
于 2017-08-07T06:43:32.510 に答える
-1

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

サンプルの結果セットとその他の方法については、ここをクリックしてください

于 2019-08-16T10:06:09.710 に答える
-2

n番目に高い給与の場合..

SELECT DISTINCT Salary
FROM EMP E WHERE
n =(SELECT COUNT(DISTINCT SALARY) 
FROM EMP WHERE E.SALARY <= SALARY)

n は必要な最大値、つまり 2,3 など

于 2013-09-17T09:32:53.370 に答える
-2

n番目に高い値の場合

select min(salary) 
from (select salary from(select salary from employee order by salary desc)where rownum<=n);
于 2013-10-06T08:48:13.257 に答える
-2

これはテーブル 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;
于 2013-08-27T16:47:08.270 に答える
-2
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
于 2013-10-07T12:24:44.913 に答える