3

まあ、それはよく知られている質問です。以下を検討してください

EmployeeID  EmployeeName    Department      Salary   
----------- --------------- --------------- ---------
1           T Cook          Finance         40000.00
2           D Michael       Finance         25000.00
3           A Smith         Finance         25000.00
4           D Adams         Finance         15000.00
5           M Williams      IT              80000.00
6           D Jones         IT              40000.00
7           J Miller        IT              50000.00
8           L Lewis         IT              50000.00
9           A Anderson      Back-Office     25000.00
10          S Martin        Back-Office     15000.00
11          J Garcia        Back-Office     15000.00
12          T Clerk         Back-Office     10000.00

2番目に高い給与を見つける必要があります

With Cte As
(
  Select 
    level
    ,Department
    ,Max(Salary) 
 From plc2_employees
 Where level = 2
 Connect By Prior (Salary) > Salary)
Group By level,Department
)

Select 
    Employeeid
    ,EmployeeName
    ,Department
    ,Salary
From plc2_employees e1
Inner Join Cte e2 On e1.Department = e2.Department
Order By 
    e1.Department
    , e1.Salary desc
    ,e1.EmployeeID

どういうわけか機能していません...正しい結果が得られません。誰でも私を助けてください。

4

9 に答える 9

7

何かのようなもの

select * from
(
select EmployeeID, EmployeeName, Department, Salary, 
rank () over (partition by Department order by Salary desc) r
from PLC2_Employees
)
where r = 2

編集 - テストしたところ、期待どおりの答えが得られました。

于 2011-11-02T15:19:38.430 に答える
6

CONNECT BY の処理方法を独学する場合は、まずその構造に適した問題を見つける必要があります。CONNECT BY は、階層形式のデータを処理するためのものですが、あなたの例はそうではありません。給与は階層的に相互に関連していません。間違った問題に構造を無理やり当てはめようとするのはイライラするし、実際には何も教えてくれません。

Oracle でインストールできるデモ HR スキーマで、従来の従業員とマネージャーの関係を見てみましょう。マネージャーを含むすべての従業員はマネージャーの直属となります (トップを除く)。次に、このスキーマを使用してクエリを作成し、会社の組織図などを表示できます。

于 2011-11-02T16:36:58.940 に答える
4

START WITH … CONNECT BY可能なすべての降順パスを探索することにより、グラフを形成するデータを探索するように設計されています。節でルート ノードを指定し、START WITH節で(節ではなく)ノード接続をCONNECT BYWHERE指定します。

WHERE節フィルターは、階層条件の後処理されGROUP BYます。HAVINGGROUP BYWHERE

したがってCONNECT BY PRIOR department = department、たとえばここでする必要があります。また、中間の給与がある場合、ノード接続が 2 つの給与間で行われないようにする必要があります。

したがって、最終的なクエリは次のようになります。

SELECT level
     , Department
     , Salary
  FROM plc2_employees pe1
 START WITH pe1.salary = (select max(salary) from plc2_employees pe2 WHERE pe2.Department = pe1.Department)
 CONNECT BY PRIOR pe1.Department = pe1.Department
        AND PRIOR pe1.Salary > pe1.Salary
        AND PRIOR pe1.Salary = ( SELECT MIN(Salary) FROM plc2_employees pe3
                                  WHERE pe3.Department = pe1.Department
                                    AND pe3.Salary > pe1.Salary
                               )

再帰条件は、子行と親行の間に中間給与がないことを示しています。

これは実際には非効率的であることに注意してください…</p>

于 2011-11-02T16:46:19.300 に答える
1

これを試してみてください。2番目に高い給与が得られます

select MAX(Salary) as Salary 
from Employee_salary 
where Salary not in (select MAX(Salary) from Employee_salary) 
于 2013-09-01T04:02:23.393 に答える
0

これを試してみてください。2番目に高い給与が得られます...

select MAX(Salary) as Salary 
from Employee_salary 
where Salary not in (select MAX(Salary) from Employee_salary )

n 番目に高い給与を見つけたい場合は、次のクエリを使用できます.... 変更を 1 つだけ行う必要があります..... N=n 番目に高い値を入力します。

乾杯....:)

SELECT * FROM Employee_salary Emp1 
WHERE (N-1) = (SELECT COUNT(DISTINCT(Emp2.Salary)) 
               FROM Employee_salary Emp2 
               WHERE Emp2.Salary > Emp1.Salary)
于 2013-09-01T05:18:17.463 に答える
0

給与として列を持つ従業員テーブルから 2 番目に高い給与を見つけます: データベース: DB2

with t as
(
select distinct salary from employee order by salary desc
),
tr as 
(
select salary, row_Number() over() r from t 
)
select salary from tr where r = 2
于 2015-02-26T12:26:42.810 に答える
-1

これは動作します -

SELECT MIN(Salary) 
FROM employee 
WHERE salary IN (SELECT TOP 2 salary FROM employee ORDER BY salary DESC)
于 2015-09-02T15:54:10.133 に答える
-3

最初に、個別の給与を降順 (最高から最低) で選択し、そのセットから上位 2 つを選択して昇順に並べ (2 を上に配置)、次にそれら 2 から上位 1 を選択します。

select top 1 s.Salary
  from 
   (select top 2 t.Salary
      from
          (select distinct Salary
             from PLC2_Employees
            order by Salary desc) t
     order by Salary asc) s
于 2011-11-02T15:26:51.370 に答える