• ベストアンサー

SQLでの条件抽出方法の記述

はじめまして。 今回、SQLである条件を絞りたいのですがその方法がいまいちピンと来ず、思考錯誤しております。 例えばですが… テーブルにCD,DATA,YMと定義します。 条件としては、 ・MAXを使わずに、YMという値の個々別の最新のもの ・同じCDは重複しない1件のみ(DISTINCT?) ・表示するのはCDとDATAのみ ・(下図で言うと)DATAは0402~0405まで(BETWEEN?) 図で表すと、 CD DATA YM ---------------- 01 AAAA 0401 01 AAAA 0402 01 AAAA 0403 01 AAaa 0404 01 AAaa 0405  ←01の最新 02 BBBB 0402 02 BBBB 0403  ←02の最新 03 CCCC 0402 03 CCCC 0404 03 cccc 0405  ←03の最新 03 cccc 0406  ←これは期間外    ↓ CD DATA YM ---------------- 01 AAaa 0405 02 BBBB 0403 03 cccc 0405 このように抽出したいのですが、良い書き方はあるでしょうか?

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

  • ベストアンサー
  • CupNaka
  • ベストアンサー率22% (13/57)
回答No.4

MAXを使えないとなると、無理に近いのではないでしょうか?MAXは使いますが、"YMという値の個々別の最新のもの"ならば可能です。 SELECT A.CD, A.DATA, A.YM FROM テーブル A, ( SELECT BB.CD, MAX(BB.YM) AS M_YM FROM テーブル BB WHERE BB.YM BETWEEN 0402 AND 0405 GROUP BY BB.CD ) B WHERE A.CD = B.CD AND A.YM = B.M_YM で出ますが。。。やっぱりMAX使用不可では難しいものがあるかと思いますよ。

LipTrek
質問者

お礼

そうですね、やっぱりこの形がベストのようです。 ほかの方法を知っている方がいたらと思いましたので、質問してみました。 基本の通り、これでやることにします。 ありがとうございました。

その他の回答 (3)

回答No.3

なぜMAXを使わないのですか?

LipTrek
質問者

補足

実際にはかなりの数の列があるもので、さらに条件が入ったりしますし、GROUP BYをなるべく省略したかったのです。 わざわざすいませんです。

回答No.2

バージョンやエディションにもよりますが、分析関数が使えるなら.. select cd,data from (select x.*, row_number() over(partition by cd order by ym desc) as R where ym between '0402' and '0405') where R=1 ; でも、”maxを使わずに”という理不尽な条件なので、 分析関数の使用が適切かどうかは知りません。

LipTrek
質問者

お礼

おお!出来そうでしたが、無理のようでした。 でも今後の参考にさせていただきます。 ありがとうございます。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>・MAXを使わずに、YMという値の個々別の最新のもの これがある限り普通は無理かと。 Oracleのようなレコードの取得順序が取れるDBならなんとなるかもしれませんが。 #無理やり数値にして-1かけてminとかいう荒業使わない限り(^^;;

LipTrek
質問者

お礼

ありがとうございます。 そうですか…確かにMINなら可能そうですが。。。 難しそうですね

関連するQ&A