2

次のクエリを作成しましたが、残念ながら機能しません。私が達成しようとしているのは、各行で選択した日付が顧客関係の有効日であることだけです。

ci_per_per表には次の列が含まれます。

per_id1per_id2start_dtend_dt

per_id1は親、per_id2は子です。

start_dtend_dt関係の期間を定義します

SELECT
  CONNECT_BY_ROOT per_id2                                                           AS per_id2,
  per_id1,
  (CASE WHEN start_dt < (PRIOR start_dt1)
            THEN (PRIOR start_dt1) 
            ELSE start_dt 
        END) AS start_dt1,
  (CASE WHEN end_dt > (PRIOR end_dt1) 
             THEN (PRIOR end_dt1) 
             ELSE end_dt 
        END)         AS end_dt1,
  level                                                                             AS "PER_LEVEL"
  FROM ci_per_per
  CONNECT BY NOCYCLE PRIOR per_id1 = per_id2

SQLで発生するエラーは次のとおりです。END_DT1: Invalid identifier.

Oracleでこの機能を実現する方法はありますか?

シナリオ例:

per_id1 | per_id2 |   start_dt  |   end_dt
-------------------------------------------
B       |   A     |  01-01-2011 | 01-01-2011
C       |   B     |  01-01-2010 | 01-01-2010
E       |   B     |  01-01-2011 | 01-01-2014
D       |   C     |  01-01-2009 | 01-01-2015

今、私はすべてのレコードを01-01-2011開始日として持つようにしたいと考えています。ただし、階層が逆の場合 (per_id_1 と Per_id2 の値を交換することを意味します)、レコードはそのまま表示されます。

上記の例では、start with句 withper_id2='A'条件で実行する必要があることに注意してください。また、クエリを実行すると結果が変わる可能性があることを理解してくださいper_id2='B'

したがって、結果から始めるとper_id2='B'、すべてのレコードが存在し、存在01-01-2010しないようにする必要があります01-01-2011

ここで終了日が設定さ01-01-2011れ、E を含むレコードと A を含むレコードを除くすべてのレコードが対象となります。終了日はnull(A から開始すると仮定して) になります。

4

2 に答える 2