有人对这个问题有建议吗?我正在尝试使用 oracle SQL 来合并effective_dt
到expiration_dt
where 中的值的范围col_a
,col_b
并col_c
保持不变,但仅适用于其中 3 列中的任何一个都没有变化的连续记录。
如果有帮助,可以安全地假设下一个记录(按员工)的生效日期等于上一个记录加上 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;
谢谢你!