トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

5-33 複数行複数列で最大のデータを取得

SQLパズル

日付テーブル
    登録日       変更日
----------   ----------
2004/01/01   2004/08/05
2004/02/10   2004/10/10
2004/10/20   2003/10/06

日付テーブルから、
登録日と変更日の両方合わせての最大値を出力する。

出力結果
最大値
----------
2004/10/20


データ作成スクリプト

create Table 日付テーブル(
登録日 date,
変更日 date);

insert into 日付テーブル values(to_date('20040101','yyyymmdd'),to_date('20040805','yyyymmdd'));
insert into 日付テーブル values(to_date('20040210','yyyymmdd'),to_date('20041010','yyyymmdd'));
insert into 日付テーブル values(to_date('20041020','yyyymmdd'),to_date('20031006','yyyymmdd'));
commit;


SQL

--■■■greatest関数を使用する方法1■■■
select to_char(max(greatest(登録日,変更日)),'yyyy/mm/dd') as 最大値 from 日付テーブル;

--■■■greatest関数を使用する方法2■■■
select to_char(greatest(max(登録日),max(変更日)),'yyyy/mm/dd') as 最大値 from 日付テーブル;

--■■■case式を使用する方法1■■■
select to_char(max(case when 登録日 < 変更日
                        then 変更日
                   else 登録日 end),'yyyy/mm/dd') as 最大値
from 日付テーブル;

--■■■case式を使用する方法2■■■
select to_char(case when max(登録日) < max(変更日)
                    then max(変更日)
               else max(登録日) end,'yyyy/mm/dd') as 最大値
from 日付テーブル;


解説

greatest関数は、引数リストの大小比較を行い一番大きい値を返します。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
下記の数式のように、比較順序が変化しても、最終的な結果は変化しないのです。
(8通りの場合に分けて容易に証明できると思います)
max(max(a,b),c)= max(a,b,c) = max(a,max(b,c))

必ず強いほうが勝つトーナメント戦と覚えてます。