SQL:複数列の最大値を求める
「複数列」の意味がやや曖昧。
上下関係を持つ複数の列(例えば日付と時間)と、同種の複数の列(例えば複数回行ったテストの点数)とがある。
1列であれば MAX 関数を使えば良いが、MAX 関数は複数列に対応していない。
文字列の大小判定なら桁を合わせて結合すればなんとかなる。
同種の複数の列の場合、その中で大小判定をした後に MAX 関数を適用すればよい。
Oracle なら、GREATEST 関数を使えば最も大きな値を求められる。
複数の上下関係を持つ列の場合、行内では大小判定できない。
グループ1つ(レコード1つ)で良いのなら ORDER BY でソートしてから LIMIT 1 で切り取る。
大きいものを求めるのでソート順には DESC 指定が必要。
code:sql
SELECT *
FROM your_table
ORDER BY 順序列1 DESC, 順序列2 DESC, ...
LIMIT 1
固定長文字列(またはそれに変換できる値)で、文字列比較で十分であれば、結合した文字列に対して MAX 関数を適用すればよい。
code:sql
SELECT ..., MAX(CONCAT(順序列1, 順序列2, ...))
FROM your_table
GROUP BY グループ列1, グループ列2,...
複数のグループで最大値を求める場合は、ROW_NUMBER() OVER (PARTITION BY グループの列, ORDER BY 順序の列) でグループ内の順位を付けて、1行目になるレコードを取得する。
code:sql
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY グループ列1, グループ列2,... ORDER BY 順序列1 DESC, 順序列2 DESC, ...) AS row_num
FROM your_table
) SUB_QUERY1
WHERE
row_num = 1
いずれにしても、全レコードを対象にしてしまうので、とても重いので注意。
参考
同じクラスで判定する例