2012-03-13 15 views
0

私を助けることができますか?年齢によって従業員の最高給与を表示するクエリ

Age  FirstName  LastName  SAL  
---------- ---------- ---------- ---------- 
30   Andy   Donald  175  
31   Petr   Pess   295  
30   John   Jacky   453  
31   Bob   Bobby   385  
29   Eric   Rice   957 

回答事前

Age  FirstName  LastName  SAL  
---------- ---------- ---------- ---------- 
31   Bob   Bobby   385  
30   John   Jacky   453  
29   Eric   Rice   957  

感謝する必要があります:姓と名

入力は、年齢によってサンプルと従業員の最高給与のリストを取得する必要があります

+0

はこの宿題はありますか?その場合は、宿題タグを含める必要があります。何を試してもうまくいかなかったのですか?良い質問をする方法のFAQをチェックしてください:http://stackoverflow.com/questions/how-to-ask –

+0

@AdamPorad、私は、ユーザーがRDBMS固有のタグを含んでいない場合、宿題でなければならない。 :) –

答えて

3

同じ年齢で給与の高い従業員がいないすべての従業員を取得します。

SELECT * 
FROM employees e1 
WHERE NOT EXISTS (
    SELECT 1 
    FROM employees e2 
    WHERE e1.age = e2.age 
    AND e1.sal < e2.sal 
) 
ORDER BY age DESC 

2人の従業員は、両方のは、あなたが(あなたが言及していない可能な窓/分析機能を持っている場合は...このクエリは、任意のデータベース

3

上で動作します返される、同じ年齢給料を持っている場合OPでRDBMS)は、次の操作を行うことができます。

SELECT * FROM (
    SELECT Age, FirstName, LastName, SAL 
     , DENSE_RANK() OVER (PARTITION BY Age ORDER BY SAL DESC) AS ranknum 
     FROM employees 
) WHERE ranknum = 1 

これは、同じ年齢の2人以上の従業員が同じ給料を持っている場合でも動作します - の両方が返されます。また、必要に応じて2番目に高い給与などを得ることができます(ranknum = 1からranknum = 2などに変更してください)。

編集:これは、少なくともOracle、SQL Server、およびPostgreSQLで動作します。 MySQLを使用している場合

+0

+ DENSE_RANK()さんのおかげで、これは新しいものです。 –

+0

これはDB2とSybase SQL Anywhereでも動作します... –

+0

@LukasEder、よく知っておいてください。 –

0

、以下の作業をする必要があります:(。それは同じ給料で同じ年齢の従業員のために複数の行を返すことはありませんが)

select * from 
(select * from myTable order by age desc, sal desc) sq 
group by age 

+0

好奇心が強いですが、どのように機能するのか説明できますか?外側の選択には、集計されていないフィールドが含まれていますか?私はGROUP BYを使うときにこれが有効なSQLだとは思わなかったのですか? – njr101

+0

これは、私が知る限りMySQLでのみ有効です。グループ化されたMySQLクエリの集約されていないフィールドは、グループの最初の行からの値を返します。 –

+0

ありがとう、私はそれを知らなかった。これは、多くのクエリに対するいくつかの斬新な解決策の可能性を広げます。 – njr101

関連する問題