sql >> データベース >  >> RDS >> Mysql

最大値に基づいてテーブルを結合する

    EDITEDの質問に答える(つまり、関連する列も取得する)。

    Sql Server 2005以降では、ランキング/ウィンドウを使用するのが最善の方法です。機能 CTE と組み合わせて 、このように:

    with exam_data as
    (
        select  r.student_id, r.score, r.date,
                row_number() over(partition by r.student_id order by r.score desc) as rn
        from    exam_results r
    )
    select  s.name, d.score, d.date, d.student_id
    from    students s
    join    exam_data d
    on      s.id = d.student_id
    where   d.rn = 1;
    

    ANSI-SQL準拠のソリューションの場合、サブクエリと自己結合は次のように機能します。

    select  s.name, r.student_id, r.score, r.date
    from    (
                select  r.student_id, max(r.score) as max_score
                from    exam_results r
                group by r.student_id
            ) d
    join    exam_results r
    on      r.student_id = d.student_id
    and     r.score = d.max_score
    join    students s
    on      s.id = r.student_id;
    

    この最後の例では、student_id / max_scoreの組み合わせが重複していないことを前提としています。重複がない場合や、重複を排除する予定がある場合は、別のサブクエリを使用して、プルするレコードを決定するための決定論的なものに参加する必要があります。 。たとえば、同じ日付の特定の学生に対して複数のレコードを作成できないと仮定して、最新のmax_scoreに基づいてタイを解除したい場合は、次のようにします。

    select  s.name, r3.student_id, r3.score, r3.date, r3.other_column_a, ...
    from    (
                select  r2.student_id, r2.score as max_score, max(r2.date) as max_score_max_date
                from    (
                            select  r1.student_id, max(r1.score) as max_score
                            from    exam_results r1
                            group by r1.student_id
                        ) d
                join    exam_results r2
                on      r2.student_id = d.student_id
                and     r2.score = d.max_score
                group by r2.student_id, r2.score
            ) r
    join    exam_results r3
    on      r3.student_id = r.student_id
    and     r3.score = r.max_score
    and     r3.date = r.max_score_max_date
    join    students s
    on      s.id = r3.student_id;
    

    編集:コメントでのマークの良いキャッチのおかげで、適切な重複排除クエリを追加しました



    1. 2点間の距離を計算する関数でOrderByを使用すると、MySQLクエリが遅くなります(long、lat)

    2. MySQLMyISAMテーブルのパフォーマンスの問題の再検討

    3. プライマリには、テーブルのパーティション分割場所エラーのすべての列が含まれている必要がありますか?

    4. mysql Select from Select