1

これは私のクエリの 1 つの結果です。

SURGERY_D
---------
01-APR-05
02-APR-05
03-APR-05
04-APR-05
05-APR-05
06-APR-05
07-APR-05

11-APR-05
12-APR-05
13-APR-05
14-APR-05
15-APR-05
16-APR-05

19-APR-05
20-APR-05
21-APR-05
22-APR-05
23-APR-05
24-APR-05

26-APR-05
27-APR-05
28-APR-05
29-APR-05
30-APR-05

連続する日付範囲を間隔にまとめたいと思います。例えば、

[01-APR-05, 07-APR-05], [11-APR-05, 16-APR-05] and so on.

テンポラル データベースに関しては、日付を「折りたたむ」必要があります。Oracleでそれを行う方法はありますか? バージョン11を使用しています。検索して本を読みましたが、その方法が見つかりませんでした/理解できませんでした。単純かもしれませんが、誰もが独自の欠点を持っており、Oracle は私のものです。また、私は SO を初めて使用するので、ルールに違反していたら申し訳ありません。ありがとう!

4

1 に答える 1

6

分析機能を利用してROW_NUMBER、各レコードに固有の連番を生成できます (その番号は昇順で日付に割り当てられます)。

次に、日付と生成された数値の差によって日付をグループ化します。連続する日付の差は同じになります。

日付番号の違い
01-APR-05 1 1 -- 差のあるグループの MIN(date_val)。= 1
2005 年 4 月 2 日 2 1
2005 年 4 月 3 日 3 1
2005 年 4 月 4 日 4 1
2005 年 4 月 5 日 5 1
2005 年 4 月 6 日 6 1
2005 年 4 月 7 日 7 1 -- 差のあるグループの MAX(date_val)。= 1
11-APR-05 8 3 -- グループ内の MIN(date_val) と差分。= 3
2005 年 4 月 12 日 9 3
2005 年 4 月 13 日 10 3
2005 年 4 月 14 日 11 3
2005 年 4 月 15 日 12 3
16-APR-05 13 3 -- グループ内の MAX(date_val) と差分。= 3

最後に、各グループの最小日付と最大日付を選択して、各範囲の開始日と終了日を取得します。

クエリは次のとおりです。

SELECT
    MIN(date_val) start_date,
    MAX(date_val) end_date
  FROM (
    SELECT
        date_val,
        row_number() OVER (ORDER BY date_val) AS rn
      FROM date_tab
  )
GROUP BY date_val - rn
ORDER BY 1
;

出力:

START_DATE END_DATE
------------ ----------
2005 年 1 月 4 日 2005 年 7 月 4 日
2005 年 4 月 11 日 2005 年 4 月 16 日
2005 年 4 月 19 日 2005 年 4 月 24 日
2005 年 4 月 26 日 2005 年 4 月 30 日

それが SQLFidlle でどのように機能するかを確認できます。Dates ranges example

于 2013-11-08T23:55:44.690 に答える