C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Oracle10g:条件によって取得するレコードを指定したい


(過去ログ 67 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■38775 / inTopicNo.1)  Oracle10g:条件によって取得するレコードを指定したい
  
□投稿者/ Yoco (11回)-(2009/07/24(Fri) 20:43:23)

分類:[その他の言語] 

2009/07/24(Fri) 20:55:44 編集(投稿者)

お世話になります。

超初心者ですので足らない情報が多々あるかも知れませんが、ご教授お願いします★

■環境
 WindowsXP SP2、Oracle 10g

【テーブル名:AAA】
区分 | 訂正 | 更新回数 | 伝票No
---------------------------------------------
101 | 0 | 0 | 25346118744
507 | 0 | 1 | 25346118744
507 | 2 | 2 | 25346118744


上記のようなデータが入っているテーブル:AAA があるとして、
区分 = '507' かつ 前レコードの 伝票No と、現レコードの 伝票No が等しい場合
更新回数 が最大であるレコードのみを取得したいのですが、どのようにSQLを書けばいいのか
思いつきません。。。

テーブル:AAA でいうと、2レコード目は読み飛ばして1レコード目と3レコード目のみを取得したいのです。

SQLのみで取得するのは難しいでしょうか?

宜しくご教授お願いいたします。


引用返信 編集キー/
■38780 / inTopicNo.2)  Re[1]: Oracle10g:条件によって取得するレコードを指定したい
□投稿者/ gtk2k (18回)-(2009/07/24(Fri) 21:36:01)
2009/07/25(Sat) 10:32:20 編集(投稿者)
2009/07/25(Sat) 10:28:20 編集(投稿者)
2009/07/25(Sat) 10:27:25 編集(投稿者)
2009/07/24(Fri) 21:42:35 編集(投稿者)
2009/07/24(Fri) 21:37:15 編集(投稿者)

Oracleマシンに入っていないので未検証。
想像上でSQLを組んでみると、
前のレコードというのが、伝票Noが同じでかつ更新回数が-1のものであるとすると

SELECT
*
FROM
AAA
WHERE
区分 != '507'
OR
(区分, 更新回数, 伝票番号) IN (SELECT t1.区分, MAX(t1.更新回数) 更新回数, 伝票番号 FROM AAA t1, AAA t2 WHERE t1.区分 = '507' AND T2.区分 = '507' AND t1.更新回数 - 1 = t2.更新回数 AND t1.伝票No = t2.伝票No GROUP BY 区分, 伝票No)

こんな感じでいけないかなぁ?
(副問合せ内でGROUP BY使えたかどうか覚えてない)
引用返信 編集キー/
■38783 / inTopicNo.3)  Re[2]: Oracle10g:条件によって取得するレコードを指定したい
□投稿者/ やじゅ (1131回)-(2009/07/24(Fri) 22:23:26)
やじゅ さんの Web サイト
No38780 (gtk2k さん) に返信

伝票bニ更新回数を文字列連結した上で、区分でグループ化
101,25346118744-0
507,25346118744-1
507,25346118744-2

未検証です。
SELECT 区分,MAX(伝票 || '-' 更新回数) FROM AAA GROUP BY 区分

引用返信 編集キー/
■38800 / inTopicNo.4)  Re[3]: Oracle10g:条件によって取得するレコードを指定したい
□投稿者/ gtk2k (20回)-(2009/07/25(Sat) 10:22:05)
2009/07/25(Sat) 10:42:51 編集(投稿者)

No38783 (やじゅ さん) に返信
ほう、そういう手があるのか。

しかし、それだと区分が507であるものすべてにおけるMAXを拾ってきちゃうんじゃね?(つまり結果が1件)
引用返信 編集キー/
■38817 / inTopicNo.5)  Re[1]: Oracle10g:条件によって取得するレコードを指定したい
□投稿者/ 魔界の仮面弁士 (1162回)-(2009/07/25(Sat) 13:46:25)
2009/07/25(Sat) 14:16:02 編集(投稿者)
# 図表モードにし忘れたので修正。

■No38775 (Yoco さん) に返信
> 【テーブル名:AAA】
> 区分 | 訂正   | 更新回数 | 伝票No	
> ---------------------------------------------
> 101   |   0    |     0    | 25346118744 
> 507   |   0    |     1    | 25346118744	
> 507   |   2    |     2    | 25346118744
> 区分 = '507' かつ 前レコードの 伝票No と、現レコードの 伝票No が等しい場合
> 更新回数 が最大であるレコードのみを取得したいのですが

これはどのような並び順になっているのでしょう。「ORDER BY 伝票No, 更新回数」でしょうか?
並び順が分からないと、どれが『前レコード』に当たるのかを定義できません。
→とりあえず、「ORDER BY 区分, 訂正, 更新回数, 伝票No」における「前レコード」だと仮定します。


また、更新回数はテーブル全体で一意なのでしょうか。
もし、テーブル内で重複する値があるとしたら、他の列と組み合わせたとき
(たとえば、区分と更新回数、あるいは伝票Noと更新回数)に、一意になりますか?
これが分からないと、『更新回数 が最大であるレコード』の取得に必要なグループ化条件を定義出来ません。
→とりあえず、「更新回数は区分ごとに一意である」と仮定します。


> どのようにSQLを書けばいいのか
上記の条件で思いついたのは、こんなSQL。。。

-----------------------------------------

SELECT 区分, 訂正, 更新回数, 伝票No FROM (
SELECT 区分, 訂正, 更新回数, 伝票No
,LEAD(区分) OVER (ORDER BY 区分, 訂正, 更新回数, 伝票No) 次の区分
,LEAD(伝票No) OVER (ORDER BY 区分, 訂正, 更新回数, 伝票No) 次の伝票No
,MAX(更新回数) OVER (PARTITION BY 区分) 区分ごとの最大更新回数 FROM AAA
) WHERE ((区分 = 507) OR (次の区分 = 507 AND 伝票No = 次の伝票No)) 
AND (更新回数 = 区分ごとの最大更新回数)

-----------------------------------------

以下、実験用データ生成用。

DROP TABLE AAA PURGE;

CREATE TABLE AAA (
区分 NUMBER(3) NOT NULL,
訂正 NUMBER(1) NOT NULL,
更新回数 NUMBER(1) NOT NULL,
伝票NO NUMBER(11) NOT NULL
--,CONSTRAINT PKEY_AAA PRIMARY KEY (区分, 更新回数)
);

INSERT ALL
 INTO AAA VALUES (101, 0, 0, 25346118744)
 INTO AAA VALUES (507, 0, 1, 25346118744)
 INTO AAA VALUES (507, 2, 2, 25346118744)
SELECT * FROM DUAL;

COMMIT;

引用返信 編集キー/
■38871 / inTopicNo.6)  Re[2]: Oracle10g:条件によって取得するレコードを指定したい
□投稿者/ Yoco (13回)-(2009/07/27(Mon) 10:27:40)
gtk2k さん、やじゅ さん、魔界の仮面弁士 さん

ご回答ありがとうございます!
土日を挟んでおりましたので返信が遅れました。。。
すみません。

確認の結果、魔界の仮面弁士 さんの方法を参考にさせていただくことにしました★

>これはどのような並び順になっているのでしょう。「ORDER BY 伝票No, 更新回数」でしょうか?
>並び順が分からないと、どれが『前レコード』に当たるのかを定義できません。
>→とりあえず、「ORDER BY 区分, 訂正, 更新回数, 伝票No」における「前レコード」だと仮定します。

「ORDER BY 区分, 訂正, 更新回数, 伝票No」でOKです。

>また、更新回数はテーブル全体で一意なのでしょうか。
>もし、テーブル内で重複する値があるとしたら、他の列と組み合わせたとき
>(たとえば、区分と更新回数、あるいは伝票Noと更新回数)に、一意になりますか?
>これが分からないと、『更新回数 が最大であるレコード』の取得に必要なグループ化条件を定義出来ません。
>→とりあえず、「更新回数は区分ごとに一意である」と仮定します。

「更新回数は区分ごとに一意」です。

説明不足によりご迷惑をおかけしました。。。

LEAD関数、なるほどです!
参考にさせていただき、SQLを作成してみます。
少し時間がかかりそうなので、一旦解決済みにしておきます☆
すみません。。。

また不明点がでてきましたら改めて質問させていただこうかと思います。

本当にありがとうございました♪


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -