質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

解決済

2回答

240閲覧

【ORACLE 12c】作業履歴データから今回履歴と前回履歴の作業日を並列して出力したい。

okapy

総合スコア13

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2019/04/12 09:09

編集2019/04/15 00:12

ORACLE 12cを使用しています。
作業履歴テーブルがあり、
指定期間の作業履歴とその作業より前日以前の作業履歴を並列して出力したいです。

【テーブル】
SAGYORIREKI(主キー:SEIHIN, SAGYODATE, SEQ)

lang

1 2CREATE TABLE SAGYORIREKI 3( 4 SEIHIN VARCHAR2(30) NOT NULL, 5 SAGYODATE DATE NOT NULL, 6 SEQ NUMBER(03) DEFAULT 0 NOT NULL, 7 NAIYO VARCHAR2(100) DEFAULT NULL , 8 CONSTRAINT SAGYORIREKI_PKEY PRIMARY KEY (SEIHIN, SAGYODATE, SEQ) USING INDEX TABLESPACE INDEX01 9) TABLESPACE USERS; 10 11INSERT INTO SAGYORIREKI VALUES ('AAA', '2016/10/01', 1, '洗浄'); 12INSERT INTO SAGYORIREKI VALUES ('AAA', '2017/09/20', 1, '洗浄'); 13INSERT INTO SAGYORIREKI VALUES ('AAA', '2017/09/20', 2, 'パーツ交換'); 14INSERT INTO SAGYORIREKI VALUES ('AAA', '2018/05/06', 1, 'オーバーホール'); 15INSERT INTO SAGYORIREKI VALUES ('BBB', '2017/06/05', 1, '洗浄'); 16INSERT INTO SAGYORIREKI VALUES ('BBB', '2017/06/05', 2, '補修'); 17INSERT INTO SAGYORIREKI VALUES ('BBB', '2018/12/22', 1, '洗浄'); 18INSERT INTO SAGYORIREKI VALUES ('CCC', '2018/01/07', 1, '洗浄'); 19INSERT INTO SAGYORIREKI VALUES ('CCC', '2018/10/14', 1, 'パーツ交換'); 20INSERT INTO SAGYORIREKI VALUES ('CCC', '2019/02/10', 1, 'パーツ交換');

【出力イメージ】
2017/06/01~2018/11/30間の製品ごとの作業履歴とその1つ前の作業履歴を表示したい。

製品 , 作業日 , SEQ, 作業内容 , 前回作業日, 前回SEQ
――――――――――――――――――――――――――――――――――――――――――――――――――――――――
AAA , 2017/09/20, 1 , 洗浄 , 2016/10/01, 1
AAA , 2017/09/20, 2 , パーツ交換 , 2016/10/01, 1
AAA , 2018/05/06, 1 , オーバーホール, 2017/09/20, 2
BBB , 2017/06/05, 1 , 洗浄 ,
BBB , 2017/06/05, 2 , 補修 ,
CCC , 2018/10/14, 1 , パーツ交換 , 2018/01/07, 1
――――――――――――――――――――――――――――――――――――――――――――――――――――――――

試したこと

以下のようなSQLで実装したのですが、レスポンスがあまりに遅かった為、伺った次第です。

lang

1SELECT D.SEIHIN, 2 D.SAGYODATE, 3 D.SEQ, 4 D.NAIYO 5 (SELECT MAX(SAGYODATE) FROM SAGYORIREKI 6 WHERE SEIHIN = D.SEIHIN 7 AND SAGYODATE < D.SAGYODATE 8 GROUP BY SEIHIN) 9 AS SAGYODATE2, 10 (SELECT MAX(SEQ) FROM SAGYORIREKI 11 WHERE (SEIHIN, SAGYODATE) IN (SELECT SEIHIN, MAX(SAGYODATE) FROM SAGYORIREKI 12 WHERE SEIHIN = D.SEIHIN 13 AND SAGYODATE < D.SAGYODATE 14 GROUP BY SEIHIN) 15 GROUP BY SEIHIN, SAGYODATE) AS SEQ2 16FROM SAGYORIREKI 17WHERE SAGYODATE BETWEEN TO_DATE('2017/06/01','YYYY/MM/DD') 18 AND TO_DATE('2018/11/30','YYYY/MM/DD')

どのようなSQL文で実現したらよいかご教授賜りたく、何卒宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/04/12 09:16

質問にCREATE TABLE文とINSERT文を提示すると適切なコメントが付き易いです。
okapy

2019/04/15 00:13

>Orlofsky様 ご助言ありがとうございます。 初めての投稿でしたので、大変助かります。
guest

回答2

0

ベストアンサー

分析関数[lag()]が使えます。

SQL

1SELECT SEIHIN, SAGYODATE, SEQ, NAIYO 2 , lag(SAGYODATE) over(partition by seihin order by SAGYODATE, SEQ) AS SAGYODATE2 3 , lag(SEQ) over(partition by seihin order by SAGYODATE, SEQ) AS SEQ2 4FROM SAGYORIREKI 5WHERE SAGYODATE BETWEEN TO_DATE('2017/06/01','YYYY/MM/DD') 6 AND TO_DATE('2018/11/30','YYYY/MM/DD')

投稿2019/04/12 10:55

編集2019/04/12 10:56
sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/04/15 09:46

どの程度改善されたかコメント貰えると、記事として今後の参考になるかと思います。
guest

0

LISTAGG を使っては?

投稿2019/04/12 09:18

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問