• ベストアンサー

2つの列からの最大値取得

もしかしたらすごく簡単なことかもしれませんが、 教えて下さい。 以下のテーブルから、date1もしくはdate2が最新の日付のデータを取得するSQL文の書き方がわかりません。 (以下の例では、bbbが取得したい) name date1 date2 ---- -------- ---------- aaa 20041110 (NULL) ---- -------- ---------- bbb (NULL) 20041111 ---- -------- ---------- ccc 20041109 (NULL) ---- -------- ---------- ddd (NULL) 20041109 ---- -------- ---------- # 図がずれてわかりづらいかと思いますが... date1,date2でそれぞれmaxでname取得後に比較するしかないのでしょうか? 環境は、Redhat9+Postgresql-7.3です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

select max(dateall) from (select date1 as dateall from table_name union select date2 as dateall from table_name) as temp; date1 と date2 を取得結果を union でくっつけてから最大値を取得するのはどうでしょうか? 列名に別名をつけてるのは私がわかり易くするためで以下でも date1 と date2 の最新を取得できると思います。 select max(date1) from (select date1 from table_name union select date2 from table_name) as temp;

その他の回答 (2)

回答No.3

回答No.1の topはMS-ACCESSでの関数です。 このtopと同様のことを実現するのが、OFFSET、LIMITです。 以下のURLを参考にしてみてください。

参考URL:
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/psql_k09.htm
  • eitetsu
  • ベストアンサー率64% (22/34)
回答No.1

この例では、必ずdate1かdate2のどちらかにしか日付は入らず、もう片方はNULLになるのでしょうか? だとすれば、もう少し簡単になると思いますが、それを保証しないものとしてみます。 あと、postgresql本体での検証はできてないので、参考としてください。 select top 1 * from table order by case when coalesce(date1, '1999-01-01') < coalesce(date2, '1999-01-01') then date1 else date2 end desc もし、どちらかが必ずNULLなら、 select top 1 * from table order by case when coalesce(date1, date2) end desc で、いけると思います。

noname#201283
質問者

補足

topというものが、どうもうまくいきません。 Postgresqlのページを見ても、使い方がよくわからないのですが、どういったものなのでしょうか? # イメージ的には、先頭の1つのみデータを表示するような感じですが。。。 あと、date1,date2のどちらかが必ずNULLと考えていますが、今後変わる可能性はあるので、必ずしもNULLではないと思っていただいてOKです。

関連するQ&A