0
Student    Subj   Period  Score
-------------------------
A          Math   100        50
A          Hist   100        100
A          Sci    200        70
B          Math   100        50
B          Hist   100        50

各学生の最高得点を照会しようとしています。

スコアがすべて同じ場合 (「B」など)、一番下の 1 つを選びます。それが不可能な場合は、 何でも選びます.

max() と min() と group by を使用して正しい結果を得るのに苦労しています。結果は次のようになります

Student    Subj   Period    Score
-------------------------
A          Hist   100       100
B          Hist   100       50
4

2 に答える 2

2

分析関数を使用したい (これは pl/sql の言及から Oracle にあると思います):

select Student, Subj, Period, Score
from (select t.*,
             row_number() over (partition by student order by score desc) as seqnum
      from t
     ) t
where seqnum = 1
于 2012-07-24T23:35:31.470 に答える
1

ゴードンの答えは確かに非常にうまく機能し、多くのデータベース エンジンでサポートされている ANSI 構文を使用しています。

Oracle には、ANSI とは思えない追加の構文がありますが、サブクエリは不要です。少なくともゴードンの答えと同じくらいうまく機能します(少し速いかもしれませんが、よくわかりません)。KEEP LAST 拡張機能を使用して関数を集約します。

select student,
       max(subj)   keep( dense_rank last order by score, period ) as subj,
       max(period) keep( dense_rank last order by score, period ) as period,
       max(score) as score
  from grades
 group by student
;

注 - 明示的にランダムな結果を提供したい場合を除いて、決定的な回答が得られるようにクエリを構成する必要があります。つまり、データがどのようにロードされたかに関係なく、特定のデータ セットは常に同じ回答を返します。上記のクエリを構成して、スコアが最も高く、その後に期間が続くようにしました。それでも同点の場合は、max(subj) が返されます。

于 2012-07-25T02:45:54.267 に答える