SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【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]   |
+-------------+--------+----------+

関連するメモ

コメント