日付範囲を折りたたみ、iteselfでSQLを実行しているときに、そしてそれをネストしたテーブルに挿入するときに、プロシージャ私は他の行に折りたたまれていたはずの行を取得しています。異なる場所で実行された同じステートメントから2つの異なる行数を取得しています
client_pk PLAN_ID GRP start_dt end_dt
8752 25171 3 1/1/2016 3/31/2016
8752 25171 1 2/1/2016 1/31/2016
と終了することにより、スタンドアローンのクエリ
として実行すると、それが適切に折りたたまれている:私は、最初の結果はのROWNUMを与えるために、最も内側のクエリから設定されているので、 SELECT client_pk,
plan_id,
grp,
MIN(start_dt) start_dt,
MAX(end_dt) end_dt
FROM (
SELECT client_pk
plan_id,
start_dt,
end_dt,
MAX(grp) OVER (PARTITION BY plan_id ORDER BY start_dt ASC) grp
FROM (
SELECT mp.client_pk,
mp.plan_id,
CASE
WHEN (LAG(mp.end_dt) OVER (PARTITION BY mp.plan_id ORDER BY mp.start_dt ASC)) BETWEEN mp.start_dt-1 AND
NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY'))
THEN NULL
ELSE ROWNUM
END grp,
mp.start_dt,
NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) end_dt
FROM client_plan mp
)
)
GROUP BY grp, plan_id, client_pk
client_pk PLAN_ID GRP start_dt end_dt
8752 25171 3 1/1/2016 3/31/2016
しかし、これらのレコードを最終的にDBに挿入されるネストした表にダンプするプロシージャを実行すると、両方の行が戻されます。
SELECT plan_spans_obj(client_pk, plan_id, start_dt, end_dt)
BULK COLLECT INTO plan_spans_ins_tbl
FROM (
SELECT client_pk,
plan_id,
start_dt,
end_dt
FROM (SELECT client_pk,
plan_id,
grp,
MIN(start_dt) start_dt,
MAX(end_dt) end_dt
FROM (
SELECT client_pk
plan_id,
start_dt,
end_dt,
MAX(grp) OVER (PARTITION BY plan_id ORDER BY start_dt ASC) grp
FROM (
SELECT mp.client_pk,
mp.plan_id,
CASE
WHEN (LAG(mp.end_dt) OVER (PARTITION BY mp.plan_id ORDER BY mp.start_dt ASC)) BETWEEN mp.start_dt-1 AND
NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY'))
THEN NULL
ELSE ROWNUM
END grp,
mp.start_dt,
NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) end_dt
FROM client_plan mp
)
)
GROUP BY grp, plan_id, client_pk
)
);
それでは、どのように私はちょうど異なっ実行、同じクエリの2つの異なる結果を、取得しています、それが実行された場所に応じた操作異なるの順です。
また、余分なレコードは基本的に負の期間です。終了日は開始日より前ですが、これはクエリで処理されます。
そのclient_pkとplan_idの生データを追加できますか?私はあなたが 'ROWNUM'を酷使しているからだと確信していますが、書き直す前に再現できるようにしたいと思います。 –