誰かがこの問題についての提案がありますか?、、の値が一定のままであるeffective_dt
までのスパンを統合するためにoracle SQLを使用しようとしていますが、その間の3つの列のいずれにも変更がない連続したレコードに対してのみです。expiration_dt
col_a
col_b
col_c
それが役立つ場合は、次のレコードの発効日(従業員別)が前のレコードに1日を加えたものに等しいと想定しても安全です。
min()
、、max()
を試してみましgroup by
たが、問題は以下のシナリオで12 / 1〜12/31が返されることです。lead()
次に、関数を試してみましたが、問題は、統合する必要のあるレコードの数が事前にわからないことです。
以下の形式でデータを取得できると仮定します。
+----------+--------------+---------------+---------+---------+---------+
| employee | effective_dt | expiration_dt | col_a | col_b | col_c |
+----------+--------------+---------------+---------+---------+---------+
| 0001 | 12/1/2012 | 12/4/2012 | value_a | value_a | value_a |
| 0001 | 12/5/2012 | 12/6/2012 | value_a | value_a | value_a |
| 0001 | 12/7/2012 | 12/10/2012 | value_a | value_a | value_a |
| 0001 | 12/11/2012 | 12/17/2012 | value_a | value_b | value_a |
| 0001 | 12/18/2012 | 12/31/2012 | value_a | value_a | value_a |
+----------+--------------+---------------+---------+---------+---------+
期待される結果:
+----------+--------------+---------------+---------+---------+---------+
| employee | effective_dt | expiration_dt | col_a | col_b | col_c |
+----------+--------------+---------------+---------+---------+---------+
| 0001 | 12/1/2012 | 12/10/2012 | value_a | value_a | value_a |
| 0001 | 12/11/2012 | 12/17/2012 | value_a | value_b | value_a |
| 0001 | 12/18/2012 | 12/31/2012 | value_a | value_a | value_a |
+----------+--------------+---------------+---------+---------+---------+
試行1:
SELECT employee,
MIN(effective_dt),
MAX(expiration_dt),
col_a,
col_b,
col_c
FROM
(SELECT employee, effective_dt, ... FROM table_x, table_y, ... where...
) table_a
GROUP BY employee,
col_a,
col_b,
col_c;
試行2:
SELECT employee,
effective_dt,
lead(expiration_dt, 1) over (partition BY employee, col_a, col_b, col_c order by effective_dt) expiration_dt,
col_a,
col_b,
col_c
FROM
(SELECT employee, effective_dt, ... FROM table_x, table_y, ... where...
) table_a;
ありがとう!