【SQL】管理番号と枝番号があるタイプのデータで最大の枝番号のデータを取得するSQL
問題
管理番号と枝番号の2つでプライマリキーになっているタイプのデータで、枝番号が大きいほどバージョンが新しいデータなんだけど、枝番号が最大のデータだけ取得したい。
SELECT * FROM T WHERE KANRI_NO IN (2012010078, 2012010077, 2012010077, 2012010076, 2012010075, 2012010075, 2012010075, 2012010075, 2012010074, 2012010073); ↓赤にした行だけ欲しい。 +-------------+--------+----------+ | KANRI_NO | EDA_NO | xxxxxxxx | +-------------+--------+----------+ | 2012010073 | 1 | [NULL] | | 2012010074 | 1 | [NULL] | | 2012010075 | 1 | [NULL] | | 2012010075 | 2 | [NULL] | | 2012010075 | 3 | [NULL] | | 2012010075 | 4 | [NULL] | | 2012010076 | 1 | [NULL] | | 2012010077 | 1 | [NULL] | | 2012010077 | 2 | [NULL] | | 2012010078 | 1 | [NULL] | +-------------+--------+----------+
答え
サブクエリを使う(MySQLのバージョンが低いときは一時テーブルを使う)。
1、GROUP BY をつかうと、集計ができる。
KANRI_NOと、そのKANRI_NOごとの枝番号の最大値を集計させる。
SELECT KANRI_NO, MAX(EDA_NO) AS EDA_NO FROM T WHERE KANRI_NO IN ( 2012010078, 2012010077, 2012010077, 2012010076, 2012010075, 2012010075, 2012010075, 2012010075, 2012010074, 2012010073 ) GROUP BY KANRI_NO;
2、その見積番号と枝番号に対して、該当するレコードを結合(JOIN)する。
SELECT T.* FROM ( SELECT KANRI_NO, MAX(EDA_NO) AS EDA_NO FROM T WHERE KANRI_NO IN ( 2012010078, 2012010077, 2012010077, 2012010076, 2012010075, 2012010075, 2012010075, 2012010075, 2012010074, 2012010073 ) GROUP BY KANRI_NO ) AS A LEFT JOIN T ON A.KANRI_NO = T.KANRI_NO AND A.EDA_NO = T.EDA_NO; +-------------+--------+----------+ | KANRI_NO | EDA_NO | xxxxxxxx | +-------------+--------+----------+ | 2012010073 | 1 | [NULL] | | 2012010074 | 1 | [NULL] | | 2012010075 | 4 | [NULL] | | 2012010076 | 1 | [NULL] | | 2012010077 | 2 | [NULL] | | 2012010078 | 1 | [NULL] | +-------------+--------+----------+
コメント