ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL指南書 複数列の最大値を求める

SQL 指南書集 目次 - ray88’s diary
SQL 列持ち→行持ちへの変換(UNION ALL) - ray88’s diary

SQLでは複数行の中から最大値、最小値を求めることは容易だが、
複数列の中から最大値・最小値を選ぶにはどのようにしたらよいか?

【お題】
以下のテーブルのx・y・z列の数値の中から最大値を取得する

【考察】
一旦 UNION ALLで列持ち→行持ちに変換してみる

SELECT key, 'x' as temp,x AS col FROM Greatests
        UNION ALL
        SELECT key,'y' AS temp,y AS col FROM Greatests
        UNION ALL
        SELECT key, 'z' AS temp,z AS col FROM Greatests;


【回答】

/* 行持ちに変換してMAX 関数(p.287) */
SELECT key, MAX(col) AS greatest
  FROM (SELECT key, x AS col FROM Greatests
        UNION ALL
        SELECT key, y AS col FROM Greatests
        UNION ALL
        SELECT key, z AS col FROM Greatests) TMP
 GROUP BY key;


【参考】テーブル作成用SQL

CREATE TABLE Greatests
(key CHAR(1) PRIMARY KEY,
 x   INTEGER NOT NULL,
 y   INTEGER NOT NULL,
 z   INTEGER NOT NULL);

INSERT INTO Greatests VALUES('A', 1, 2, 3);
INSERT INTO Greatests VALUES('B', 5, 5, 2);
INSERT INTO Greatests VALUES('C', 4, 7, 1);
INSERT INTO Greatests VALUES('D', 3, 3, 8);