私は数日間この問題に取り組んできましたが、今は大衆に助けを求めています。複数のスパンを1つのタイムライン(Oracle 11g)にマージ/分割する方法は?
このサイト上の以前の解決策として、私の問題は、類似したが、全く同じではありません。私の問題は、その一部だけでなく、マージを必要とするのに対し、 PL/SQL Split, separate a date into new dates according to black out dates! このソリューションは、(含める/除外)ではなくブール値です。
私は、SQL + PL/SQLの中間的/高度な把握があると思っていますが、Oracle Analytic関数が明らかに私の心を揺さぶっています。私は読んでいる/学ぶことを試みてきたが、私は時間がなくなっている。
テーブル名(COTS)、ビジネスラインなどを共有することの合法性がわからないので、私はあいまいなシナリオ/コンテキストで自分の問題を模倣します。うまくいけばそれは弁護士の精神を払拭するでしょう。
問題: 私は顧客の活動履歴を格納したテーブルを持っています。顧客は出入りすることができるので、この表には(顧客ごとに)複数の行がある可能性があります。
CREATE TABLE activity AS
SELECT 1 AS cust_id,
TO_DATE('01-JAN-2010') AS start_dt,
TO_DATE('31-JUL-2010') AS end_dt,
'EAST' AS region
FROM DUAL
UNION
SELECT 1 AS cust_id,
TO_DATE('01-FEB-2011') AS start_dt,
TO_DATE('31-DEC-2011') AS end_dt,
'EAST' AS region
FROM DUAL;
また、スパンごとに属性情報を格納するテーブルもあります。顧客は、一度に複数の属性タイプを持つことができ、それぞれのタイプをさまざまなタイムパンに対して複数回持つことができます。
CREATE TABLE attrib AS
SELECT 1 AS cust_id,
'POWER' AS atb_cd,
TO_DATE('01-JAN-2009') AS atb_start_dt,
TO_DATE('31-JAN-2010') AS atb_end_dt,
'LocalNuke' AS provider,
1.80 AS per_kwh,
0 AS per_gal
FROM DUAL
UNION
SELECT 1 AS cust_id,
'POWER' AS atb_cd,
TO_DATE('01-MAR-2010') AS atb_start_dt,
TO_DATE('31-MAR-2010') AS atb_end_dt,
'CoalGuys' AS provider,
1.60 AS per_kwh,
0 AS per_gal
FROM DUAL
UNION
SELECT 1 AS cust_id,
'POWER' AS atb_cd,
TO_DATE('01-JUN-2010') AS atb_start_dt,
TO_DATE('30-SEP-2010') AS atb_end_dt,
'LocalNuke' AS provider,
1.70 AS per_kwh,
0 AS per_gal
FROM DUAL
UNION
SELECT 1 AS cust_id,
'POWER' AS atb_cd,
TO_DATE('01-MAR-2011') AS atb_start_dt,
TO_DATE('31-DEC-9999') AS atb_end_dt,
'GeoHeat' AS provider,
1.10 AS per_kwh,
0 AS per_gal
FROM DUAL
UNION
SELECT 1 AS cust_id,
'WATER' AS atb_cd,
TO_DATE('01-MAR-2010') AS atb_start_dt,
TO_DATE('31-DEC-9999') AS atb_end_dt,
'GlacialGold' AS provider,
0 AS per_kwh,
0.60 AS per_gal
FROM DUAL;
データ奇妙は私ができるように私は、「現実の世界」に関連されることなく、現実世界のように、このシナリオを作ってみました、意図的です。
この結果は、架空の会社との顧客の活動にスパンを制限し、すべての重複する日付を分割してタイムラインを形成する必要があります。データ要素は、報告のために併合する必要があります。
視覚:
Cust:
|----------------------| |------------------------|
Power:
|-------------| |--| |-------| |---------------------->
Water:
|------------------------------------------------------>
Expected Result:
|----|----|--|----|----| |----|-------------------|
ソリューションは、他の属性を含めるようにスケーラブルでなければなりません。最後に、この非正規化情報をテーブルに入れて、いつでも顧客のデータを報告することができました。たとえば、特定の日に活動、電力、水があった場合、その日のper_kwh、per_gal、およびactivityデータをエクスポートできるはずです。
の出力例(表形式):スロー・バイ・スロー2つの非同期カーソル処理を使用して(行・バイ(要件はちょうどアクティビティ/パワーに似ていたとき)
CUST_ID FROM_DT THRU_DT REGION POWER_PROVIDER WATER_PROVIDER PER_KWH PER_GAL
------- ----------- ----------- ------ -------------- -------------- ------- -------
1 01-JAN-2010 31-JAN-2010 EAST LocalNuke 1.80 0
1 01-FEB-2010 28-FEB-2010 EAST 0 0
1 01-MAR-2010 31-MAR-2010 EAST CoalGuys GlacialGold 1.60 0.60
1 01-APR-2010 31-MAY-2010 EAST GlacialGold 0 0.60
1 01-JUN-2010 31-JUL-2010 EAST LocalNuke GlacialGold 1.70 0.60
1 01-FEB-2011 28-FEB-2011 EAST GlacialGold 0 0.60
1 01-MAR-2011 31-DEC-2011 EAST GeoHeat GlacialGold 1.10 0.60
は、私は約2年前に何かを書きました-行)。
パフォーマンスは重要ですが、ストレート/バルクSQLソリューションを見つけようとしている最大の理由はメンテナンスです。私の元のソリューションのif/elseカーソルネストは、すでにそれに従うのが難しく、少なくとも2つ以上の "属性"スパンで分割することにより、指数関数的に悪化します。
あなたが提供できるすべてのヘルプに感謝します。
あなたが望むクエリの出力を投稿できますか?ビジュアルは役に立ちますが、ビジュアルを表形式のクエリ結果に変換する方法を理解していません。 –
期待される表出力を含めるように変更された質問 - @JustinCaveさんが推奨する – Brock