こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

SELECTした結果をSELECTしたい!

初めて利用させていただきます。
-miru-と申します。

現在、
RDBMS:IBM DB2 7.2
OS:Windows 2000
なのですが、
タイトルの通り、
SELECT結果がSELECTできず困っています。

やりたい事の概要
YMD_DATAはDATE型です。
1.
SELECT YMD_DATA
FROM TEST.TEST_TABLE
WHERE YMD_DATA < '2004-10-15' AND
FLAG = '1'
ORDER BY YMD_DATA DESC
FETCH FIRST 30 ROWS ONLY
でFLAGが1且つ指定した年月日以前のデータを
新しいものから30件取得
2.
1で取得した結果の一番古い年月日(30個目のデータ)を
 取得

と、いう感じなのですが、どうもうまくいきません。。
1つのSQLで書きたいのですが、これは可能でしょうか?

分かる方がいらっしゃいましたら、
ご教授お願いいたします。
失礼します。

投稿日時 - 2004-10-15 12:13:16

QNo.1042959

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

1.新しいもの順にRANKをつける
2.RANKが30以下(新しいもの30位まで)取得
3.順位が低い順に表示
4.1件のみ取得

"2."で同日のものがあった場合30ぴったしにはならないけど、欲しいデータは
「指定日にち内の30番目に新しいデータ行」
という解釈であればこれでいいんではないでしょうか?
----------------------------------------------
SELECT YMD_DATA, RNK
FROM
(
SELECT
--新しいもの順に順位をつける
YMD_DATA,RANK() OVER (ORDER BY YMD_DATA DESC) AS RNK

FROM
TEST.TEST_TABLE
WHERE
YMD_DATA < '2004-10-15'
AND FLAG = '1'
) as aaa
--新しいもの上位30件を取得
WHERE RNK <= 30

--順位が低い順に表示
ORDER BY RNK DESC
FETCH FIRST 1 ROWS ONLY

投稿日時 - 2004-11-09 16:11:28

ANo.4

こんばんは。

>()の中の文でORDER BYを使うとダメになってしまう感じです。
そんな事はありませんよ。
DB2でも副問い合わせ式内で、ORDER BYは使えます。
って、マニュアルにはありますが・・・?

FROM句でダメなら、WHERE句に指定してみては?
大外で、逆ORDER BYとFETCH FIRST 1 ROWS ONLY
みたいな感じでは・・・?
(^^ゞ

投稿日時 - 2004-10-15 19:05:33

ANo.3

DB2で確認できる環境が無いので想像で答えています。
以下の様に、最小の日付を取れば良いのではないでしょうか?

SELECT MIN(YMD_DATA)
FROM TEST.TEST_TABLE
WHERE YMD_DATA < '2004-10-15' AND
FLAG = '1'
ORDER BY YMD_DATA DESC
FETCH FIRST 30 ROWS ONLY

投稿日時 - 2004-10-15 16:38:15

お礼

回答ありがとうございます^^

nukiさんに回答いただいたSQLだと

SELECT 文節、HAVING 文節、または ORDER BY 文節に指定された "YMD_DATA" で始まる式が、GROUP BY 文節に指定されていないか、あるいは GROUP BY 文節の指定されていない列関数のある SELECT 文節、 HAVING 文節、または ORDER BY 文節中に入っています。

と、いうエラーが出てしまいます。。
それでGROUP BY を追加すると、やっぱり1件にしぼられないのです。。

良回答ありがとうございましたM(__)M

投稿日時 - 2004-10-15 17:01:30

ANo.2

select YMD_DATA from (
SELECT YMD_DATA
FROM TEST.TEST_TABLE
WHERE YMD_DATA < '2004-10-15' AND
FLAG = '1'
ORDER BY TAIS_YMD_DATA asc
FETCH FIRST 30 ROWS ONLY) tblTemp
order by YMD_DATA desc

でできないかな。
つまり最初に「YMD_DATA」をascで30件取る。で,さらに「YMD_DATA」をdescで1件取る。
なんてどうですか?

RDBMSていうのがどんなのか知らないんだけど。

投稿日時 - 2004-10-15 12:29:44

補足

迅速な回答ありがとうございますm(__)m

"FLAG = '1'" に続いて予期しないトークン "ORDER" が見つかりました。入力が予想されるトークンには ")" が含まれている可能性があります。

と、エラーメッセージが出てしまいSQLが通りません;_;
すごくいけそうな予感がしたのですが。。

>最初に「YMD_DATA」をascで30件取る。
のところなのですが、YMD_DATAから
WHEREで指定した年月日以前で、新しいものを30件と取得したいので、descでないといけないかと思います。。

投稿日時 - 2004-10-15 12:42:43

ANo.1

FROM の後ろにSELECT文を書けばよろしいかと

例えば

SELECT * FROM (SELECT * FROM テーブル WHERE 条件1)
WHERE 条件2

こんな感じで

投稿日時 - 2004-10-15 12:27:07

補足

回答ありがとうございます^^

私も最初そう思いまして、そういう風に記述してみたのですが

"_DATA < '2004-10-15'" に続いて予期しないトークン "ORDER" が見つかりました。入力が予想されるトークンには ")" が含まれている可能性があります。

とエラーメッセージが出てしまいました。

何だか
SELECT * FROM (SELECT * FROM TABLE_NAME)
は()の中の文でORDER BYを使うとダメになってしまう感じです。
ORDER BY を()内で使用しない場合は通るのです。。
でも使用しないと正しい結果が得られないので、困っています。。

投稿日時 - 2004-10-15 12:51:43

あなたにオススメの質問