web-dev-qa-db-ja.com

テーブルで2番目に高い給与の従業員を取得する方法

それは私が今日の午後に得た質問です:

そこには、SQL Serverで、従業員のID、名前、および給与を含むテーブルがあり、2番目に高い給与の従業員の名前を取得します。

ここに私の答えがあります、私はそれを紙に書いただけで、それが完全に有効であることを確信していませんが、うまくいくようです:

SELECT Name FROM Employees WHERE Salary = 
( SELECT DISTINCT TOP (1) Salary FROM Employees WHERE Salary NOT IN
 (SELECT DISTINCT TOP (1) Salary FROM Employees ORDER BY Salary DESCENDING)
ORDER BY Salary DESCENDING)

私はそれはthinkいと思うが、それが私の頭に浮かぶ唯一の解決策だ。

より良いクエリを提案してもらえますか?

どうもありがとうございました。

35
Vimvq1987

使用できる給与額が2番目に高い従業員の名前を取得します。

;WITH T AS
(
SELECT *,
       DENSE_RANK() OVER (ORDER BY Salary Desc) AS Rnk
FROM Employees
)
SELECT Name
FROM T
WHERE Rnk=2;

給与がインデックス化されている場合、特に従業員が多い場合は、次の方が効率的です。

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT MIN(Salary)
                 FROM   (SELECT DISTINCT TOP (2) Salary
                         FROM   Employees
                         ORDER  BY Salary DESC) T);

テストスクリプト

CREATE TABLE Employees
  (
     Name   VARCHAR(50),
     Salary FLOAT
  )

INSERT INTO Employees
SELECT TOP 1000000 s1.name,
                   abs(checksum(newid()))
FROM   sysobjects s1,
       sysobjects s2

CREATE NONCLUSTERED INDEX ix
  ON Employees(Salary)

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT MIN(Salary)
                 FROM   (SELECT DISTINCT TOP (2) Salary
                         FROM   Employees
                         ORDER  BY Salary DESC) T);

WITH T
     AS (SELECT *,
                DENSE_RANK() OVER (ORDER BY Salary DESC) AS Rnk
         FROM   Employees)
SELECT Name
FROM   T
WHERE  Rnk = 2;

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT DISTINCT TOP (1) Salary
                 FROM   Employees
                 WHERE  Salary NOT IN (SELECT DISTINCT TOP (1) Salary
                                       FROM   Employees
                                       ORDER  BY Salary DESC)
                 ORDER  BY Salary DESC)

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT TOP 1 Salary
                 FROM   (SELECT TOP 2 Salary
                         FROM   Employees
                         ORDER  BY Salary DESC) sel
                 ORDER  BY Salary ASC)  
31
Martin Smith
 SELECT *従業員から
 WHERE Salary IN(SELECT MAX(給与)
 FROM Employee 
 WHERE Salary NOT IN(SELECT MAX(給与)
 FFROM従業員)); 

このようにしてみてください。

34
amateur

これはあなたを助けるかもしれません

SELECT 
      MIN(SALARY) 
FROM 
      EMP 
WHERE 
      SALARY in (SELECT 
                      DISTINCT TOP 2 SALARY 
                 FROM 
                      EMP 
                 ORDER BY 
                      SALARY DESC
                )

nthの代わりにn(ここでn > 0)を置くことで、2最高給与を見つけることができます。

5の例番目 給料の最高額n = 5

10
meekash55

CTEはどうですか?

;WITH Salaries AS
(
    SELECT Name, Salary,
       DENSE_RANK() OVER(ORDER BY Salary DESC) AS 'SalaryRank'
    FROM 
        dbo.Employees
)
SELECT Name, Salary
FROM Salaries  
WHERE SalaryRank = 2

DENSE_RANK()は、2番目に高い給与を持つすべての従業員を提供します-(同一の)最も高い給与を持つ従業員の数に関係なく。

7
marc_s

別の直観的な方法は次のとおりです。-N番目に高い給与を見つけたいとします

1)給与の降順に従って従業員をソートします

2)rownumを使用して最初のNレコードを取得します。このステップでN番目のレコードはN番目に高い給与です

3)次に、この一時的な結果を昇順で並べ替えます。したがって、N番目に高い給与が最初の記録になりました

4)この一時的な結果から最初のレコードを取得します。

N番目に高い給与になります。

select * from 
 (select * from 
   (select * from  
       (select * from emp order by sal desc)  
   where rownum<=:N )  
 order by sal )
where rownum=1;

給与が繰り返される場合は、最も内側のクエリでdistinctを使用できます。

select * from 
 (select * from 
   (select * from  
       (select distinct(sal) from emp order by 1 desc)  
   where rownum<=:N )  
 order by sal )
where rownum=1;
5
Kaushik Lele

次のクエリはすべてMySQLで機能します。

SELECT MAX(salary) FROM Employee WHERE Salary NOT IN (SELECT Max(Salary) FROM Employee);

SELECT MAX(Salary) From Employee WHERE Salary < (SELECT Max(Salary) FROM Employee);

SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1;

SELECT Salary FROM (SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT 2) AS Emp ORDER BY Salary LIMIT 1;
4
Pratik Patil
select MAX(Salary) from Employee WHERE Salary NOT IN (select MAX(Salary) from Employee );
4
steave

Oracle、MySQLなどに固有の特別な機能を使用しないシンプルな方法.

EMPLOYEEテーブルに次のようなデータがあるとします。給与は繰り返すことができます。 enter image description here

手動分析により、次のようにランクを決定できます。
enter image description here

クエリでも同じ結果が得られます

select  *
from  (
select tout.sal, id, (select count(*) +1 from (select distinct(sal) distsal from     
EMPLOYEE ) where  distsal >tout.sal)  as rank  from EMPLOYEE tout
) result
order by rank

enter image description here

最初に、明確な給与を見つけます。次に、各行よりも多い個別の給与のカウントを見つけます。これはそのIDのランクに他なりません。最高給与の場合、このカウントはゼロになります。したがって、ランクを1から開始するために「+1」が行われます。

上記のクエリにwhere句を追加することで、N番目のランクのIDを取得できるようになりました。

select  *
from  (
select tout.sal, id, (select count(*) +1 from (select distinct(sal) distsal from     
EMPLOYEE ) where  distsal >tout.sal)  as rank  from EMPLOYEE tout
) result
where rank = N;
3
Kaushik Lele

以下のクエリを使用して、n番目の最大値を見つけることができます。n番目の数値の2を置き換えるだけです。

select * from emp e1 where 2 =(select count(distinct(salary)) from emp e2
   where e2.emp >= e1.emp)
2
Gopal Sanodiya

同じ給与を持っている従業員の数がわからないため、DENSE_RANKを使用したいと思うと思います。

CREATE TABLE #Test
(
    Id INT,
    Name NVARCHAR(12),
    Salary MONEY
)

SELECT x.Name, x.Salary
FROM
        (
        SELECT  Name, Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) as Rnk
        FROM    #Test
        ) x
WHERE x.Rnk = 2

ROW_NUMBERは、給与が同額であっても一意の番号付けを行い、複数の人が最高の給与を結んでいる場合、平易なRANKはランクとして「2」を与えません。 DENSE_RANKがこれに最適な仕事をするので、これを修正しました。

2
ericb

これを試して、それぞれのn番目に高い給与を取得してください。

SELECT
    *
FROM
    emp e1
WHERE
    2 = (
        SELECT
            COUNT(salary)
        FROM
            emp e2
        WHERE
            e2.salary >= e1.salary
    )
1
Ajay Kumar
select max(age) from yd where age<(select max(age) from HK) ; /// True two table Highest 

SELECT * FROM HK E1 WHERE 1 =(SELECT COUNT(DISTINCT age) FROM HK E2 WHERE E1.age < E2.age); ///Second Hightest age RT single table 

select age from hk e1 where (3-1) = (select count(distinct (e2.age)) from yd e2 where e2.age>e1.age);//// same True Second Hight age RT two table

select max(age) from YD where age not in (select max(age) from YD);  //second hight age in single table 
1
H K RAO

ここでは、インタビュー中に尋ねられる次のシナリオに2つのクエリを使用しました
最初のシナリオ:
テーブル内の2番目に高い給与をすべて検索します(複数の従業員がいる2番目に高い給与)。

select * from emp where salary
   In (select MAX(salary) from emp where salary NOT IN (Select MAX(salary) from 
   emp));

2番目のシナリオ:
表の2番目に高い給与のみを検索します

select min(temp.salary) from (select * from emp order by salary desc limit 2) 
  temp;
1
Gobi

ほとんどの答えは有効です。以下のように、ソートされた給与でオフセットを使用できます。

SELECT NAME
FROM EMPLOYEES
WHERE SALARY IN
(
    SELECT DISTINCT 
           SALARY
    FROM EMPLOYEES
    ORDER BY SALARY DESC
    OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY
);

N番目に高い給与を見つけるには、オフセット1をnに置き換えます

1
Code_Mode

これは単純なクエリです。2番目の最小値が必要な場合は、最大値を最小値に変更し、小なり記号(<)をより大なり記号(>)に変更します。

    select max(column_name) from table_name where column_name<(select max(column_name) from table_name)
1
anurag sethi

2番目に高い給与を受け取っている従業員の名前を表示する場合は、これを使用します。

SELECT employee_name 
FROM employee
WHERE salary = (SELECT max(salary) 
                FROM employee
                WHERE salary < (SELECT max(salary) 
                                FROM employee);
1

私たちも使用できますか

select e2.max(sal), e2.name
from emp e2
where (e2.sal <(Select max (Salary) from empo el))
group by e2.name

このアプローチの何が問題なのか教えてください

1
lakshmi

これを試して

    select * from
   (
    select name,salary,ROW_NUMBER() over( order by Salary desc) as
    rownum from    employee
   ) as t where t.rownum=2

http://askme.indianyouth.info/details/write-a-sql-query-to-find-the-10th-highest-employee-salary-from-an-employee-table-explain-your- answer-111

1
Harikesh Yadav
SELECT * 
FROM TABLE1 AS A 
WHERE NTH HIGHEST NO.(SELECT COUNT(ATTRIBUTE) FROM TABLE1 AS B) WHERE B.ATTRIBUTE=A.ATTRIBUTE;
1
PRASAD
select * from emp where salary = (  
    select salary from   
       (select ROW_NUMBER() over (order by salary) as 'rownum', *
        from emp) t -- Order employees according to salary  
    where rownum = 2 -- Get the second highest salary
)
1
sh_kamalh
SELECT name
FROM employee
WHERE salary =
(SELECT MIN(salary) 
  FROM (SELECT TOP (2) salary
  FROM employee
  ORDER BY salary DESC) )
1
Himalaya Garg

次のようなテーブルがあるとします

name       salary
 A           10
 B           30
 C           20
 D           40

したがって、最初に降順で並べる40 30 20 10 =>

その後、最初の2つの数値のみを取得します=> 40 30

次に、昇順で並べ替えます=> 30 40

その後、最初の番号を取得します=> 30

mysqlで::

SELECT * FROM (SELECT  * FROM employee   order by salary DESC LIMIT 2) order by salary ASC LIMIT 1;

oracleで::

SELECT * FROM (SELECT  * FROM employee  where rownum<=2 order by salary DESC )  where rownum<=1  order by salary ASC ;
0
SELECT `salary` AS emp_sal, `name` , `id`
FROM `employee`
GROUP BY `salary` ORDER BY `salary` DESC
LIMIT 1 , 1 
0
mayurjadhav
SELECT MIN(a.sal) 
FROM dbo.demo a 
WHERE a.sal IN (SELECT DISTINCT TOP 2 a.sal 
                FROM dbo.demo a 
                ORDER BY a.sal DESC) 
0

このクエリは、給与が2番目に高い従業員のすべての詳細を表示します

SELECT
    *
FROM
    Employees
WHERE
    salary IN (
        SELECT
            max(salary)
        FROM
            Employees
        WHERE
            salary NOT IN (
                SELECT
                    max(salary)
                FROM
                    Employees
            )
    );
0
Somex Gupta

問題に対する4つのソリューションの編集:

最初の解決策-サブクエリの使用

従業員からのSELECT MAX(salary)----このクエリは、最高給与を提供します

次に、上記のクエリをサブクエリとして使用して、次のように次に高い給与を取得します。

SELECT MAX(salary) FROM employee WHERE salary <> (SELECT MAX(salary) from Employee)-このクエリは、2番目に高い給与を提供します

次に、2番目に高い給与を取得している従業員の名前を取得する場合は、上記のクエリをサブクエリとして使用して、次のように取得します

SELECT name from employee WHERE salary = 
(SELECT MAX(salary) FROM employee WHERE salary <> (SELECT MAX(salary) from Employee)

-このクエリでは、2番目に高い給与が得られます)

2番目の解決策-派生テーブルの使用

SELECT TOP 2 DISTINCT(salary) FROM employee ORDER BY salary DESC-これにより、2つの最高給与が得​​られます。ここで行っているのは、給与を降順で並べ、上位2つの給与を選択することです。

ここで、上記の結果セットを昇給順に昇順に並べ、TOP 1を取得します

SELECT TOP 1 salary FROM
(SELECT TOP 2 DISTINCT(salary) FROM employee ORDER BY salary DESC) AS tab 
ORDER BY salary

3番目の解決策-相関サブクエリを使用する

SELECT name, salary FROM Employee e WHERE 2=(SELECT COUNT(DISTINCT salary) FROM Employee p WHERE e.salary<=p.salary)

4番目の解決策-ウィンドウ関数を使用する

;WITH T AS
(
SELECT *, DENSE_RANK() OVER (ORDER BY Salary Desc) AS Rnk
FROM Employees
)
SELECT Name
FROM T
WHERE Rnk=2;
0
Dipendu Paul
 - Method 1

    select max(salary) from Employees
        where salary< (select max(salary) from Employees)



 - Method 2

 select MAX(salary) from Employees 
    where salary not in(select MAX(salary) from Employees)



 - Method 3

select MAX(salary) from Employees 
    where salary!= (select MAX(salary) from Employees )
0
Tuscan
SELECT lastname, firstname
FROM employees
WHERE salary IN(
    SELECT MAX(salary) 
    FROM employees 
    WHERE salary < (SELECT MAX(salary) FROM employees));

したがって、上記のコードが行うことは次のとおりです。

すべての従業員の最高給与よりも低い給与を持つ従業員の姓が続く姓を返しますが、最高給与を持っていない残りの従業員の最高給与でもあります。

つまり、2番目の最高給与を持つ従業員の名前を返します。

簡単な方法はOFFSETを使用することです。 2番目だけでなく、オフセットを使用してクエリできる任意の位置。

SELECT SALARY,NAME FROM EMPLOYEE ORDER BY SALARY DESC LIMIT 1 OFFSET 1 --Second最大

SELECT SALARY,NAME FROM EMPLOYEE ORDER BY SALARY DESC LIMIT 1 OFFSET 9 --10th最大

0
REMITH

この簡単な方法を試してください

select name,salary from employee where salary =
(select max(salary) from employee where salary < (select max(salary) from employee ))
0
Vilas Galave

2番目に高い給与を見つけるには...

SELECT MAX( salary)  FROM tblEmp WHERE salary< ( SELECT MAX( salary) FROM tblEmp )

または

SELECT max(salary) FROM tblEmp WHERE salary NOT IN (SELECT max(salary) FROM tblEmp)

ここで、「給与」は列名であり、tblEmpはテーブル名です...両方とも100%動作しています...

0
Durgesh Pandey

これはおそらく最も簡単だと思います。

SELECT Name FROM Employees group BY Salary DESCENDING limit 2;
0
Abhilash
declare

cntr number :=0;

cursor c1 is

select salary from employees order by salary desc;

z c1%rowtype;

begin

open c1;

fetch c1 into z;

while (c1%found) and (cntr <= 1) loop


cntr := cntr + 1;

fetch c1 into z;

dbms_output.put_line(z.salary);

end loop;

end;
0
Ashish sinha

一時テーブルの作成

Create Table #Employee (Id int identity(1,1), Name varchar(500), Salary int)

データを挿入

Insert Into #Employee
    Select 'Abul', 5000
Union ALL 
    Select 'Babul', 6000
Union ALL 
    Select 'Kabul', 7000
Union ALL 
    Select 'Ibul', 8000
Union ALL 
    Select 'Dabul', 9000

クエリは

select top 1 * from #Employee a
Where a.id <> (Select top 1 b.id from #Employee b ORDER BY b.Salary desc)
order by a.Salary desc

ドロップテーブル

drop table #Empoyee
0
amnippon
SELECT
    salary
FROM
    Employee
ORDER BY
    salary DESC
LIMIT 1,
 1;
0
Kiran

簡単なアプローチを次に示します。

select name
from employee
where salary=(select max(salary)
              from(select salary from employee
                   minus
                   select max(salary) from employee));
0
Vikas Bansal

このSQLを使用すると、2番目に高い給与が従業員名で取得されます

Select top 1 start at 2 salary from employee group by salary order by salary desc;
0
Deepraj Shetty
select 
    max(salary) 
from 
    emp_demo_table 
where 
    salary < (select max(salary) from emp_demo_table)

これが最も簡単な用語でクエリを解決することを願っています。

ありがとう

0
Ash

下の画像にこのような表があり、「to_user」列で2番目に大きい数を見つけます。 enter image description here

回答はこちら

select MAX(to_user)FROM db.masterledger where to_user NOT IN(SELECT MAX(to_user)FROM db.masterledger);

0
Vignesh R

Select * from employee where salary = (Select max(salary) from employee where salary not in(Select max(salary)from employee))

説明:

  • クエリ1:給与が含まれていない従業員からmax(salary)を選択します(従業員からmax(salary)を選択します)-このクエリは2番目に高い給与を取得します

  • クエリ2: Select * from salary =(クエリ1)-このクエリは、2番目に高い給与を持つすべてのレコードを取得します(2番目に高い給与には複数のレコードがある場合があります)

0
vinod wakade
SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee)
0
Avinash Singh

おそらく最も簡単なソリューションをここに投稿したいと思います。 mysqlで機能しました。

最後に確認してください:

SELECT name
FROM `emp`
WHERE salary = (
SELECT salary
FROM emp e
ORDER BY salary DESC
LIMIT 1
OFFSET 1 
0
Vandana

MSSQLでこれを試してください:

SELECT
    TOP 1 salary
FROM
    (
        SELECT
            TOP 2 salary
        FROM
            Employees 
    ) sal
ORDER BY
    salary DESC;

ただし、あらゆる種類のデータベースで機能するこの汎用SQLクエリを試してください。

SELECT
    MAX(salary)
FROM
    Employee
WHERE
    Salary NOT IN (
        SELECT
            Max(Salary)
        FROM
            Employee
    );

または

SELECT
    MAX(Salary)
FROM
    Employee
WHERE
    Salary < (
        SELECT
            Max(Salary)
        FROM
            Employee
    );
0
Faisal

n番目に高い給与。その簡単な方法

select t.name,t.sal
from (select name,sal,dense_rank() over (order by sal desc) as rank from emp) t
where t.rank=6; //suppose i find 6th highest salary
0
NAUSHAD AHAMAD

これを試して

select * from (
   select ROW_NUMBER() over (order by [salary] desc) as sno,emp_name,   
   [salary] from [dbo].[Emp]
) t 
where t.sno =10

with t as
select top (1) * from       
  (select top (2) emp_name,salary from   [Emp]  e
   order by  salary desc) t
order  by salary asc

試してみてください:行の数に関係なく動的な結果が得られます

SELECT * FROM emp WHERE salary = (SELECT max(e1.salary) 
FROM emp e1 WHERE e1.salary < (SELECT Max(e2.salary) FROM emp e2))**
0
Jyo