2017-05-18 6 views
-1

各部門の最高給与の差額を見つける方法を教えてください。各部門の上位2人の給与の差

DeptID  EmpName Salary 
Engg  Sam  10000 
Engg  Smith  15000 
HR   Denis  20000 
HR   Archie 15000 
HR   Danny  30000 
IT   David  25000 
IT   Chrish 40000 
IT   John  35000 

結果は、内側にはメインテーブルに参加し、導出し、そのクエリを使用して、以下のクエリから

-- Assuming a temp table named as #salary 

select deptid, max(salary) as MaxSal_2nd from #salary 
where salary not in (select max(salary) from #salary group by deptid) 
group by deptid 

をDEPTIDあたりの第二の最大の給料を探す

DeptID Salary 
Engg  5000 
HR   10000 
IT   5000 
+4

どのデータベースを使用していますか? – Mansoor

+0

@Mansoor私はMySqlを使用しています –

+0

あなたが試したことを見せて、指定部門の2つの最高給与が同じであれば何が起こるかを教えてください。 – Strawberry

答えて

1

あなたはサブクエリを使用することができます違い。

select 
baseq.DeptID, 
max(case when baseq.SalaryRank=1 then baseq.Salary else 0 end) - max   
(case  when baseq.SalaryRank=2 then baseq.Salary else 0 end) 
from 
(
    select DeptID, EmpName, Salary, Rank() over (parition by DeptID order by 
    Salary Desc) as SalaryRank 
    from TestTable 
) baseq 
group by baseq.DeptID 
+0

出力を得ましたが、複雑さを減らすことができます。ここではNNNに入ります。 –

+1

任意の命令的言語のためにSQLのような集合に基づく言語を混同しないでください、彼らは同じランタイムを持っていません。インデックスを追加することで、複雑さを軽減できます。 – Donnie

0

する必要があります以下のように、1pt当たりの最大値との差。だから、最後のクエリ:ピボット、その後、部門内給与のランクを取得するには、ウィンドウfunctoinsを使用し、トップ2の給与を探し、見つける

SELECT 
    DeptID, 
    (MAX(Salary) - (SELECT 
    MAX(Salary) 
    FROM your_table 
    WHERE DeptID = yt.DeptID 
    AND Salary < 
    MAX(yt.Salary)) 
) sal_diff 
FROM your_table yt 
GROUP BY DeptID 
ORDER BY DeptID 
+0

出力を得ましたが、ここでは複雑さを減らすことができます。 * N * Nは私たちがN * Nに入ることができます –

0

select s.deptid,max(salary)-Max(dt.MaxSal_2nd) from #salary s 
inner join 
(select deptid, max(salary) as MaxSal_2nd from #salary 
where salary not in (select max(salary) from #salary group by deptid) 
group by deptid)dt --Second Max Salary per deptId 
on s.deptid=dt.deptid 
group by s.deptid 
関連する問題