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

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

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

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

2631閲覧

SQLで非連続日付の抜けている日付データ作成方法

tttbbb

総合スコア8

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/04/14 23:12

非連続日付のデータで抜けている日付のデータを作成したいと考えています。
間で抜けている日付の項目値には抜けている日付以前の最大の日付のデータから
項目値を複製してデータを作成したいです。
(下部にデータイメージを作りました)
ループを使用しないで一括のINSERT、UPDATE等を駆使して作成する方法が
ありましたらご教授お願い致します。

元データ

キー日付項目1項目2
00012021/01/1212
00012021/01/1534
00012021/01/1656
00012021/01/2078

作成したいデータ

キー日付項目1項目2
00012021/01/1212
00012021/01/1312
00012021/01/1412
00012021/01/1534
00012021/01/1656
00012021/01/1756
00012021/01/1856
00012021/01/1956
00012021/01/2078

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

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

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

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

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

m.ts10806

2021/04/15 00:33 編集

「任意の期間の連続した日付を作る」やり方なら調べたら出てきます。 まず自身で思うようにやってみてください。 ※連続させるのだから結局ループは必須ですよ
sazi

2021/04/15 03:49

@m.ts10806さん 連続した値を持つ表を準備すれば、SQLのみで行えるのでループは不要になります。
guest

回答2

0

ベストアンサー

このような要件だと、スクリプトやPL/SQLなどで対応したほうが良いかと思いますが、どうしても1回のクエリで実現したいのであれば、以下のようになるかと思います。

SQL

1INSERT INTO t (キー, 日付, 項目1, 項目2) 2WITH 3p (キー, 日付) AS ( 4 SELECT キー, MIN(日付) 5 FROM t 6 GROUP BY キー 7 UNION ALL 8 SELECT キー, (日付 + INTERVAL '1' DAY) 9 FROM p 10 WHERE 日付 < (SELECT MAX(日付) FROM t WHERE p.キー = t.キー) 11), 12q (キー, 日付, 項目1, 項目2, rnk) AS ( 13 SELECT 14 p.キー, 15 p.日付, 16 t.項目1, 17 t.項目2, 18 RANK() OVER (PARTITION BY p.キー, p.日付 ORDER BY t.日付 DESC) 19 FROM p 20 JOIN t ON p.キー = t.キー AND t.日付 <= p.日付 21) 22SELECT キー, 日付, 項目1, 項目2 23FROM q 24WHERE rnk = 1 25AND NOT EXISTS ( 26 SELECT * FROM t WHERE t.キー = q.キー AND t.日付 = q.日付 27)

やっていることは単純で、おおよそ以下の通りです。

  • 連続した日付は再帰SQLを使って生成 (ループを使っているといえばその通りですが…)
  • RANK関数とJOINを組み合わせることで、直近の日付からのデータの複製を実現
  • INSERT SELECTでデータを投入

投稿2021/04/15 13:22

neko_the_shadow

総合スコア2349

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

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

tttbbb

2021/04/15 22:34

詳細なサンプル含め、丁寧なご回答ありがとうございます。 こちらでやりたかったことができそうです。 RANK関数が肝ですね、とても勉強になりました。
guest

0

Oracle 連続した日付を取得 とLEFT OUTER JOINしては?

投稿2021/04/15 03:34

Orlofsky

総合スコア16417

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問