例!私は4列のテーブルを持っています。この場合、日付フォーマットDD.MM.YY交差していない期間の最小/最大日付の選択
id ban start end
1 1 01.01.15 31.12.18
1 1 02.02.15 31.12.18
1 1 05.04.15 31.12.17
行2及び3からの日付は5行目から日付が行から日付に含まれている。この場合、列から日付1
1 1 02.04.19 31.12.20
1 1 05.05.19 31.12.20
に含まれています4.基本的に、交差していない2つの期間があります。日付が別で1つの期間で始まり、終わる
01.01.15 31.12.18
と
02.04.19 31.12.20
状況は不可能です。最終結果は
私はanalitical機能(LAG)を使用してみました。この1 1 01.01.15 31.12.18
1 1 02.04.19 31.12.20
のように、私は行を注文すると、現在の日付が以前に含まれている場合、私はそれらを交換
select id
, ban
, case
when start >= nvl(lag(start) over (partition by id, ban order by start, end asc), start)
and end <= nvl(lag(end) over (partition by id, ban order by start, end asc), end)
then nvl(lag(start) over (partition by id, ban order by start, end asc), start)
else start
end as start
, case
when start >= nvl(lag(start) over (partition by id, ban order by start, end asc), start)
and end <= nvl(lag(end) over (partition by id, ban order by start, end asc), end)
then nvl(lag(end) over (partition by id, ban order by start, end asc), end)
else end
end as end
from table
になります。私はちょうど2行を持っている場合、それは動作します。たとえば、この
1 1 08.09.15 31.12.99
1 1 31.12.15 31.12.99
は、私はその後、すべてのフィールドでグループは、私が欲しいものを得ることができ、この
1 1 08.09.15 31.12.99
1 1 08.09.15 31.12.99
になり、より多く存在する場合
1 2 13.11.15 31.12.99
1 2 31.12.15 31.12.99
1 2 16.06.15 31.12.99
私は
を取得します1 2 16.06.15 31.12.99
1 2 16.06.15 31.12.99
1 2 13.11.15 31.12.99
私はこれがなぜ起こるのか理解していますnsですが、どうすれば回避できますか?クエリを複数回実行することはオプションではありません。
どのOracleのバージョン。 12の場合は、match_recognizeが答えになります。http://modern-sql.com/feature/match_recognize –
"日付形式dd.MM.yy" - 日付形式はありません。それらは[7-bytes](https://stackoverflow.com/questions/13568193/how-are-dates-stored-in-oracle)として内部的に保存され、デフォルトでフォーマットするユーザーインターフェイスです(通常は'NLS_DATE_FORMAT'セッションパラメータ)を使用します。 – MT0
@ MT0私の間違い。私はオラクルにあまりよく慣れていない。しかし、情報ありがとう) – Evgenii