給与表から3番目またはn番目の最大給与を見つける方法は?


回答:


82

使用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

テーブルから最低給与レコードを取得する方法?ins.FKYS_PAT_ID = '1253_717'とins.FKYS_INS_TYPE in(1)およびins.BOL_TYPE in(1,3)とins.salary in(min(ins.salary)
sayesh kilaru 2013

想像してみてください。従業員テーブルには10,0000レコードがあります。上記のクエリを使用すると、パフォーマンスが6〜10倍低下します。
Bimal Das 2017

1
@BimalDas:次に、EmpSalary列にインデックスがありません。また、何と比べて減った?このROW_NUMBERアプローチの利点は、を使用できること..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)です。したがって、これを使用してグループを取得できますが、その列には引き続きアクセスできます。
Tim Schmelter 2017年

@TimSchmelter WITH CTEは、最初のSELECTステートメントのデータ全体を格納する一時テーブルを作成し、その結果から "SELECT EmpID、EmpName、EmpSalary FROM CTE WHERE RN = @NthRow"を選択します。だから少し遅いと思います。確認しました。また、適切なインデックス付けも行っています。
Bimal Das 2017

2
@BimalDas:いいえ、一時テーブルは作成されません。通常、CTEはどこにも具体化されません。インラインビューや名前付きサブクエリに似ています。
Tim Schmelter 2017年

88

行番号:

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

テーブルから最低給与レコードを取得する方法?ins.FKYS_PAT_ID = '1253_717'とins.FKYS_INS_TYPE in(1)およびins.BOL_TYPE in(1,3)とins.salary in(min(ins.salary)から、cmn_pat_x_insurance insからins.KYS_IDとins.FKYS_INS_IDを選択します。
sayesh kilaru 2013

クマールとアレクサンダー、もう1つフィールドを取得したいのですが、どうすればよいですか?私のクエリは "" "Select Top 1 NoteID From(Select DateDiff(Year、SchedualDate、Current_TimeStamp)as NoteAge、Distinct Top 3 NoteID From [dbo]。[DocSecheduale] Order by NoteID Desc)a Order by NoteID" ""
ザビードアッバシ

私はn番目に高い給与を見つけていますが、サブクエリを理解するために複雑になっています。
サブクエリ

@deepak_javaサブクエリは、行が外部クエリによって処理されるたびに評価されます。つまり、内部クエリはEmp1値も使用するため、内部クエリは外部クエリと独立して処理できません。
Kumar Manish 2015年

なぜ... WHERE (N-1) = (Subquery)...機能するのかを理解することが重要です。サブクエリは、メインクエリからWHERE使用さEmp1れるため、相関クエリです。サブクエリは、メインクエリが行をスキャンするたびに評価されます。SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800たとえば、(800、1000、700、750)から3番目に大きい給与(N = 3)を見つける場合、1行目のサブクエリは0になります。4番目の給与値(750)... WHERE Emp2.Salary > 750は2またはNになります-1、したがってこの行が返されます。
ジェリーマウス2016

65

これを試して

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

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


これはOracle 10gまたは11gで動作しますか?または、このような代替案はありますか?
RBz 2018

40

最適化の方法が必要な場合は、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)

最も簡単で覚えやすい。1
Sнаđошƒаӽ

4
最高給与を取得するには、なぜASCオーダーで行うのか、DESCオーダーで行う必要があります。この7000,10000,11000,500,800,900,12000のような給与がある場合、並べ替えの内部クエリはtop3になり、500,800,900を意味しますこれらの最大値は900ですが、900は3、最大ではない、3最大の給料は10000です
ナレンドラJaggi

1
例:最大3給与:SELECT Min(EmpSalary)FROM Salary WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
Jimit Rupani

15

サブクエリを使用する場合は単純すぎます。

SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);

ここでは、LIMIT制約の後のn番目の値を変更できます。

ここでは、このサブクエリで、EmpSalary DESC Limit 3によって従業員の注文からEmpSalaryを選択します。従業員のトップ3の給与を返します。結果から、MINコマンドを使用して最低給与を選択し、従業員の3番目のTOP給与を取得します。


このエラーを取得しています。エラーコード:1248すべてのテーブルは、独自の別名を持っている必要があります派生

エイリアスを追加します。SELECT MIN(EmpSalary)from(SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3)as s;
anonxss

DISTINCTを使用して、SELECT MIN(EmpSalary)from(SELECT DISTINCT(EmpSalary)from Employee ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh 2018

14

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

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

説明

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

そしてソース


+1なぜ... WHERE (N-1) = (Subquery)...機能するのかを理解することが重要です。サブクエリは、メインクエリからWHERE使用さEmp1れるため、相関クエリです。サブクエリは、メインクエリが行をスキャンするたびに評価されます。SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800たとえば、(800、1000、700、750)から3番目に大きい給与(N = 3)を見つける場合、1行目のサブクエリは0になります。4番目の給与値(750)... WHERE Emp2.Salary > 750は2またはNになります-1、したがってこの行が返されます。
ジェリーマウス2016

13

サブクエリを使用せずに給与テーブルから3番目またはn番目の最大給与

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

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


3
OFFSET FETCHはSQL Server 2012 +バージョンから利用できることを言及することが重要です。
Zerotoinfinity、2015

11
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3

1
DENSE_RANK()のおかげで聞いたことがない
Vivekh

8

n番目に高い給与を取得するには、次のクエリを参照してください。このようにして、MYSQLでn番目に高い給与を得ます。n番目に低い給与を取得する場合は、クエリでDESCをASCに置き換える必要があります。 n番目に高い給与


1
問題は、MySQLではなくSQLサーバーについてです。
bummi 2014年


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

方法1は並べ替えが可能です:SELECT TOP 1 SALARY FROM(SELECT TOP 3 SALARY FROM EMPLOYEES)*理由
Ashish Agrawal Yodlee

5

2008年には、ROW_NUMBER()OVER(ORDER BY EmpSalary DESC)を使用して、使用できる結合なしのランクを取得できます。

たとえば、この方法で8番目に高い値を取得したり、@ Nを別の値に変更したり、必要に応じて関数のパラメーターとして使用したりできます。

DECLARE @N INT = 8;
WITH rankedSalaries AS
(
SELECT
EmpID
,EmpName
,EmpSalary,
,RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM salary
)
SELECT
EmpID
,EmpName
,EmpSalary
FROM rankedSalaries
WHERE RN = @N;

SQL Server 2012では、ご存知かもしれませんが、これはLAG()を使用してより直感的に実行されます。



3

これは、SQLインタビューでよくある質問の1つです。列のn番目に高い値を見つけるために、さまざまなクエリを書き留めます。

以下のスクリプトを実行して、「Emloyee」という名前のテーブルを作成しました。

CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)

次に、以下のinsertステートメントを実行して、このテーブルに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を見つけます。以下のクエリをManagement Studioで実行したところ、結果が表示されました。

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

3
Select TOP 1 Salary as '3rd Highest Salary' from (SELECT DISTINCT TOP 3 Salary from Employee ORDER BY Salary DESC) a ORDER BY Salary ASC;

3番目に高い給与を表示しています


3
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'

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 )


3

テーブルから3番目に高い値を取得するには

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1

SELECT Distinct columnName FROM tableName ORDER BY columnName DESC LIMIT
2、1

2

サブクエリ:

SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)

1

このクエリを試す

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

n =を入れたい値を入れてください



1

MySQLテスト済みソリューション、N = 4と仮定:

select min(CustomerID) from (SELECT distinct CustomerID FROM Customers order by CustomerID desc LIMIT 4) as A;

もう一つの例:

select min(country) from (SELECT distinct country FROM Customers order by country desc limit 3);

1

このコードを試してください:-

SELECT *
   FROM one one1
   WHERE ( n ) = ( SELECT COUNT( one2.salary )
                   FROM one one2
                   WHERE one2.salary >= one1.salary
                 )

1
select * from employee order by salary desc;

+------+------+------+-----------+
| id   | name | age  | salary    |
+------+------+------+-----------+
|    5 | AJ   |   20 | 100000.00 |
|    4 | Ajay |   25 |  80000.00 |
|    2 | ASM  |   28 |  50000.00 |
|    3 | AM   |   22 |  50000.00 |
|    1 | AJ   |   24 |  30000.00 |
|    6 | Riu  |   20 |  20000.00 |
+------+------+------+-----------+




select distinct salary from employee e1 where (n) = (select count( distinct(salary) ) from employee e2 where e1.salary<=e2.salary);

nを、数値としてn番目に高い給与に置き換えます。



0
select 
    Min(salary) 
from ( select salary from employees order by salary desc) t
where rownum<=3;

2番目に高い給与の場合は、上記のクエリで3を2に変更し、N番目に高い給与の場合はNに変更します(N = 1,2,3,4 ...)。


0

SELECT * FROM(顧客からの異なる給与を給与DESCで注文)制限4,1;

制限4,1は、最初の4行を残し、次の行を選択することを意味します。

制限と行番号は、使用しているプラ​​ットフォームによって異なります。

これを試してみてください。


0

注:クエリのオフセット3をN番目の整数に置き換えてください

SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS 
FETCH NEXT 1 ROWS ONLY

説明

次の1行のみフェッチ

1行のみを返す

オフセット3行

最初の3つのレコードを除外するここでは、任意の整数を使用できます


0

サブクエリには常に時間がかかります。

以下のクエリを使用して、最高および最低のデータを取得します。

最高のデータ: select *from business order by id desc limit 3,1;

最低データ: select *from business order by id asc limit 3,1;

3の代わりにNを使用して、n番目のデータを取得できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.