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

グループ化されたSQL結果の各グループの最大値を持つレコードを取得します

    正しい解決策は次のとおりです。

    SELECT o.*
    FROM `Persons` o                    # 'o' from 'oldest person in group'
      LEFT JOIN `Persons` b             # 'b' from 'bigger age'
          ON o.Group = b.Group AND o.Age < b.Age
    WHERE b.Age is NULL                 # bigger age not found
    

    仕組み:

    oの各行に一致します bのすべての行 列Groupに同じ値があります Age列の値が大きくなります 。 oの任意の行 Age列にグループの最大値がありません bの1つ以上の行に一致します 。

    LEFT JOIN グループ内の最も古い人(グループ内で一人でいる人を含む)をNULLでいっぱいの行と一致させます s bから (「グループ内で最大の年齢はありません」)。
    INNER JOINの使用 これらの行は一致せず、無視されます。

    WHERE 句は、NULLを持つ行のみを保持します s bから抽出されたフィールド 。彼らは各グループの最年長者です。

    さらなる読み物

    このソリューションと他の多くのソリューションは、本 SQLアンチパターン:データベースプログラミングの落とし穴の回避で説明されています。



    1. Oracle SQL Developerを使用してデータをエクスポートする方法は?

    2. 構文例を使用したCREATETABLEMySQL vs T-SQL

    3. MariaDBの日時値にマイクロ秒を追加する8つの方法

    4. SQLでデータを変換するための関数はありますか