プロが教える店舗&オフィスのセキュリティ対策術

はじめまして。
今回、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

このように抽出したいのですが、良い書き方はあるでしょうか?

A 回答 (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使用不可では難しいものがあるかと思いますよ。
    • good
    • 0
この回答へのお礼

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

基本の通り、これでやることにします。
ありがとうございました。

お礼日時:2004/11/30 12:09

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

この回答への補足

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

補足日時:2004/11/30 12:03
    • good
    • 0

バージョンやエディションにもよりますが、分析関数が使えるなら..



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を使わずに”という理不尽な条件なので、
分析関数の使用が適切かどうかは知りません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/30 12:03

>・MAXを使わずに、YMという値の個々別の最新のもの



これがある限り普通は無理かと。

Oracleのようなレコードの取得順序が取れるDBならなんとなるかもしれませんが。

#無理やり数値にして-1かけてminとかいう荒業使わない限り(^^;;
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/30 12:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!