- ベストアンサー
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 このように抽出したいのですが、良い書き方はあるでしょうか?
- みんなの回答 (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使用不可では難しいものがあるかと思いますよ。
その他の回答 (3)
- peugeot307
- ベストアンサー率22% (29/130)
なぜMAXを使わないのですか?
補足
実際にはかなりの数の列があるもので、さらに条件が入ったりしますし、GROUP BYをなるべく省略したかったのです。 わざわざすいませんです。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
バージョンやエディションにもよりますが、分析関数が使えるなら.. 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を使わずに”という理不尽な条件なので、 分析関数の使用が適切かどうかは知りません。
お礼
おお!出来そうでしたが、無理のようでした。 でも今後の参考にさせていただきます。 ありがとうございます。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>・MAXを使わずに、YMという値の個々別の最新のもの これがある限り普通は無理かと。 Oracleのようなレコードの取得順序が取れるDBならなんとなるかもしれませんが。 #無理やり数値にして-1かけてminとかいう荒業使わない限り(^^;;
お礼
ありがとうございます。 そうですか…確かにMINなら可能そうですが。。。 難しそうですね
お礼
そうですね、やっぱりこの形がベストのようです。 ほかの方法を知っている方がいたらと思いましたので、質問してみました。 基本の通り、これでやることにします。 ありがとうございました。