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;