2017-03-27 18 views
0

他のクエリの上に各グループの最大値を選択する方法を知っていますか?他のクエリの上に各グループの最大値を選択する最も良い方法

例テーブル:

SELECT * 
FROM table 
WHERE Class = 'Math1' 

結果のテーブルを使用して、私は試験によってグループ化すると、最大級で唯一の行を保つ:

Class Exam Grade 
Math1 Mid  1 
Math2 Mid  2 
Math1 Final  1 

は、私はこのような最初のクエリを持っていると言います:

SELECT view1.* 
FROM 
(SELECT * 
    FROM table 
    WHERE Class = 'Math1') AS view1, view2 
WHERE view1.Exam = view2.Exam 
AND view1.Grade > view2.Grade 

問題同じテーブルに対して2つの別名を付けることはできません。したがって、view1とview2は動作しません。ベストプラクティスはありますか? ありがとうございました!

UPDATE: が回答をありがとうございました、それは私を助けたが、私はWITHと、次の解決策を覚えしようとしていた。

WITH view AS (SELECT * 
       FROM table 
       WHERE Class = 'Math1) 
SELECT view1.* 
FROM view view1, view view2 
WHERE view1.Exam = view2.Exam 
AND view1.Grade > view2.Grade 

答えて

0

なぜ:

SELECT distinct max(grade) over (partition by exam), exam 
    FROM table 
    WHERE Class = 'Math1' 
0

の場合最高級の行が必要な場合は、order bylimitを使用してください。

SELECT * 
FROM table 
WHERE Class = 'Math1' 
ORDER BY grade DESC 
LIMIT 1; 
0

あなたは最高グレードのための絆を含めたい場合は、あなたができる代わりに、row_number

0

rankを使用するすべてのMathクラス

select * from (
    select *, 
     row_number() over (partition by exam, Class order by grade desc) rn 
    where Class = 'Math1' 
) t where rn = 1 

のための試験につき最高グレードで行を選択するrow_numberを使用することができます各試験の最高グレードの行を選択するdistinct onを使用します。

select distinct on (exam) exam, 
    t.* 
from (
    -- Your query here 
    select * 
    from table 
    where class = 'Math1' 
    ) t 
order by exam, 
    grade desc; 

、または直接:

select distinct on (exam) exam, 
    t.* 
from table 
where class = 'Math1' 
order by exam, 
    grade desc; 
関連する問題