- ベストアンサー
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です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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)
- net_lander
- ベストアンサー率49% (40/81)
回答No.1の topはMS-ACCESSでの関数です。 このtopと同様のことを実現するのが、OFFSET、LIMITです。 以下のURLを参考にしてみてください。
- eitetsu
- ベストアンサー率64% (22/34)
この例では、必ず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 で、いけると思います。
補足
topというものが、どうもうまくいきません。 Postgresqlのページを見ても、使い方がよくわからないのですが、どういったものなのでしょうか? # イメージ的には、先頭の1つのみデータを表示するような感じですが。。。 あと、date1,date2のどちらかが必ずNULLと考えていますが、今後変わる可能性はあるので、必ずしもNULLではないと思っていただいてOKです。