2017-10-23 2 views
1

私はすでにこのクエリを実行して、それを得る:Oracle SQLで "over(partition by)"を使用して2番目の最大給与を得る方法はありますか?

SELECT * 
    FROM 
     (
     SELECT emp_id,salary,row_number() over(order by salary desc) AS rk 
     FROM test_qaium 
    ) 
    where rk=2; 

しかし、私の友人の1は従業員テーブルから2番目MAX給与を見つけるために私に尋ねるのOracle SQLでは「over(partition by)」を使用しなければなりません。誰でも私を助けてください。 そして、oracle sqlの "Partition by"の概念をクリアしてください。

+0

私に質問をしてください。 –

+0

あなたのお問い合わせは、あなたのことがあなたのものだと思われるようです。あなたの問題は何ですか? –

+0

**あなたの質問に** [EDIT] **し、[サンプルデータ](http://plaintexttools.github.io/plain-text-table/)とそのデータに基づいて予想される出力を追加してください。 [**フォーマットされたテキスト**](http://stackoverflow.com/help/formatting)、** **スクリーンショットはありません**(http://meta.stackoverflow.com/questions/285551/why-may -i-not-upload-images-of-code-on-so-asking-a-question/285557#285557)。 ** [編集] **あなたの質問 - コメントを投稿するコードや追加情報はありません**。 –

答えて

1

Oracleのセットアップ

CREATE TABLE test_qaium (emp_id, salary, department_id) AS 
    SELECT 1, 10000, 1 FROM DUAL UNION ALL 
    SELECT 2, 20000, 1 FROM DUAL UNION ALL 
    SELECT 3, 30000, 1 FROM DUAL UNION ALL 
    SELECT 4, 40000, 1 FROM DUAL UNION ALL -- One highest, one 2nd highest 
    SELECT 5, 10000, 2 FROM DUAL UNION ALL 
    SELECT 6, 20000, 2 FROM DUAL UNION ALL 
    SELECT 7, 30000, 2 FROM DUAL UNION ALL 
    SELECT 8, 30000, 2 FROM DUAL UNION ALL -- Two highest, one 2nd highest 
    SELECT 9, 10000, 3 FROM DUAL UNION ALL 
    SELECT 10, 10000, 3 FROM DUAL UNION ALL -- Two highest, no 2nd highest 
    SELECT 11, 10000, 4 FROM DUAL UNION ALL -- One highest, no 2nd highest 
    SELECT 12, 20000, 5 FROM DUAL UNION ALL 
    SELECT 13, 20000, 5 FROM DUAL UNION ALL 
    SELECT 14, 30000, 5 FROM DUAL;   -- One highest, Two 2nd highest 

クエリ

SELECT * 
FROM (
    SELECT t.*, 
     DENSE_RANK() OVER (PARTITION BY department_id 
          ORDER BY salary DESC) AS rnk 
    FROM test_qaium t 
) 
WHERE rnk=2; 

出力

これは、各部門のための第二の最高給与を持つすべての行を取得します。

EMP_ID SALARY DEPARTMENT_ID RNK 
------ ------ ------------- --- 
    3 30000    1 2 
    6 20000    2 2 
    12 20000    5 2 
    13 20000    5 2 
+0

ありがとうございます。これを正確にしたい。 申し訳ありませんが、私の低い評判のために私はあなたの答えに投票できません。 –

1

あなたが同じ給料で複数の従業員を持っている場合は、クエリが動作しません...

試してみてください。

SELECT emp_id, 
     salary, 
     dense_rank() over(order by salary desc) AS rk 
FROM test_qaium 

partition by句がして、グループのように動作し、かつ必要ここでは何もありませんグループ化。

+0

ありがとうございます。しかし、私は、クエリで "over(partition by)"を使用する必要があることに言及します。実際にはそれが可能かどうかを知ることは好奇心のためでした。 –

関連する問題