web-dev-qa-db-ja.com

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

最適化された方法で給与table(EmpID,EmpName,EmpSalary)からthird or nthの最大給与を見つける方法は?

89
Karan Gandhi

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
72
Rango

行番号

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
84

これを試して

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

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

53
Codesen

最適化方法が必要な場合はTOPキーワードを使用します。したがって、n番目のmaxとminの給与は次のように照会されますが、集約関数名を使用すると逆の順序で照会が複雑になります。

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)
37

あなたがサブクエリを使用するならばあまりにも単純です!

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

ここではLIMIT制約の後でn番目の値を変更するだけです。

ここでは、サブクエリ「EmpSalaryによるEmployee OrderからEmpSalaryの選択」を参照してください。DESC制限3。従業員の上位3位の給与を返します。結果から、MINコマンドを使用して最小給与を選択して、従業員の3番目のTOP給与を取得します。

13
devutkarsh

Nをあなたの最大数に置き換えてください

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

説明

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

そして出典

12
Luv

副問合せを使用せずに給与表から3番目またはn番目の最大給与

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

3番目に高い給料のためにN-1の代わりに2を入れる

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

N番目に高い給料を得るために次の質問を参照してください。このようにしてあなたはMYSQLでn番目に高い給与を得る。 n番目に低い給与だけを取得したい場合は、照会でDESCをASCに置き換える必要があります。 nth highest salary

6
Vijay Bhatt

方法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
5
user4391070
SELECT EmpSalary 
FROM salary_table 
GROUP BY EmpSalary 
ORDER BY EmpSalary DESC LIMIT n-1, 1;

2008年には、ROW_NUMBER()OVER(ORSER 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()を使用してより直感的に実行されます。

4
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR   ORDER BY GRN_NAME DESC
print @maxNthSal
3

- 給与の最高額

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
Surya
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
kiran lanke
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'
3
Vikas Joshi

これは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

最適化された方法:サブクエリの代わりにlimitを使うだけです。

select distinct salary from employee order by salary desc limit nth, 1;

ここで制限構文を参照してください http://www.mysqltutorial.org/mysql-limit.aspx

2
Kishor Vitekar

副照会で:

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

このクエリを試してください

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

N =置く値

1
Mayur Sawant
set @n = $n

SELECT a.* FROM ( select a.* , @rn = @rn+1  from EMPLOYEE order by a.EmpSalary desc ) As a  where rn = @n

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

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

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

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

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
Charlie

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

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) 
0
Thomas

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

サンプルの結果セットとその他の方法 clickhere

0
Mahesh

テーブルからN番目に高い給与を見つけます。これはdense_rank()関数を使用してこのタスクを実行する方法です。

enter image description here

select linkorder from u_links

select max(linkorder) from u_links

select max(linkorder) from u_links where linkorder < (select max(linkorder) from u_links)

select top 1 linkorder 
       from ( select distinct top 2 linkorder from u_links order by linkorder desc) tmp 
order by linkorder asc

DENSE_RANK:1. DENSE_RANKは、順序付けられた行のグループ内の行のランクを計算し、そのランクをNUMBERとして返します。ランクは、1から始まる連続した整数です。2.この関数は、任意の数値データ型として引数を受け入れ、NUMBERを返します。 3.分析関数として、DENSE_RANKは、order_by_clause内のvalue_exprsの値に基づいて、他の行に対するクエリから返された各行のランクを計算します。 4.上記のクエリでは、ランクは従業員テーブルのsalに基づいて返されます。同点の場合は、すべての行に同じランクが割り当てられます。

WITH result AS ( 
     SELECT linkorder ,DENSE_RANK() OVER ( ORDER BY linkorder DESC ) AS  DanseRank 
FROM u_links ) 
SELECT TOP 1 linkorder FROM result WHERE DanseRank = 5
0
Fezal halai

注:クエリの OFFSET 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 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
0

AdventureWorks2012を使用してnth highest bonusを問い合わせるには、n=10とします。次のコードを試してください。

USE AdventureWorks2012; 
GO

SELECT * FROM Sales.SalesPerson;
GO

DECLARE @grade INT;
SET @grade = 10;
SELECT MIN(Bonus)
FROM (SELECT TOP (@grade) Bonus FROM (SELECT DISTINCT(Bonus) FROM Sales.SalesPerson) AS a ORDER BY Bonus DESC) AS g
0
Mahabubul Islam
select 
    Min(salary) 
from ( select salary from employees order by salary desc) t
where rownum<=3;

2番目に高い給与の場合は、上記の照会で3から2に変更し、N番目の最も高い給与の場合はN = 1,2,3,4 ...に変更します。

0
user2603985

SELECT * FROM(給与のDESCで顧客の注文から個別の給与を選択する)制限4,1。

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

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

これを試してください、それはうまくいくでしょう。

0
Saif Grover

これを試してください...

SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
0
Deepak Kumar
select min(salary) 
from (select salary 
      from employee 
      where rownum < n+1 
      order by salary desc);
0
Ashok Ogirala

3番目に高い給与をすべて表示:

select * from emp where sal=
(SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1) ;

3番目に高い給与のみを表示します。

SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1
0
Gobi

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

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

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

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

N番目のデータを取得するために3の代わりにNを使用できます。

0
Ankit Gupta

// 2番目に高い給与を取得する場合は、table。

SELECT *  FROM tablename t1 
WHERE (N-1) = (SELECT COUNT(DISTINCT(t2.Salary)) 
 FROM tablename t2
WHERE t2.Salary > t1.Salary)
0
Mukesh Kumar