我正在尝试获取某个员工在某个主管代码中的日期。某些员工可能在其雇佣期间有从主管切换到非主管的间隙。我在获取主管状态更改之前的日期(以获取主管任期的最后日期)时遇到问题。下面是我使用的表。
| ID|员工|职位_职称|生效日期|主管_状态|
| --------------|--------------|--------------|--------------|--------------|
| 一二三四|约翰·亚当斯|总裁|2020-01-05 2020-01-05|主管|
| 一二三四|约翰·亚当斯|总裁|2020-01-04 2020-01-04|主管|
| 一二三四|约翰·亚当斯|总裁|2020-01-03 2020-01-03|主管|
| 一二三四|约翰·亚当斯|总裁|2020-01-02 2020-01-02|主管|
| 一二三四|约翰·亚当斯|总裁|2020-01-01 2020-01-01|主管|
| 一二三四|约翰·亚当斯|工作人员|2017-01-02 2017-01-02|非主管|
| 一二三四|约翰·亚当斯|工作人员|2016-01-04 2016-01-04|非主管|
| 一二三四|约翰·亚当斯|工作人员|2015-01-05 2015-01-05|非主管|
| 一二三四|约翰·亚当斯|工作人员|2014-01-06 2014-01-06|非主管|
| 一二三四|约翰·亚当斯|副总裁|2013-11-11 2013-11-11|主管|
| 一二三四|约翰·亚当斯|副总裁|2012-01-01 2012-01-01|主管|
| 一二三四|约翰·亚当斯|工作人员|2017-01-02 2017-01-02|非主管|
| 一二三四|约翰·亚当斯|工作人员|2016-01-04 2016-01-04|非主管|
| 一二三四|约翰·亚当斯|工作人员|2015-01-05 2015-01-05|非主管|
| 一二三四|约翰·亚当斯|工作人员|2014-01-06 2014-01-06|非主管|
| 五六七八|斯泰西·琼斯|总裁|2018-01-02 2018-01-02|主管|
| 五六七八|斯泰西·琼斯|总裁|2016-02-11 2016-02-11 2016-02-11|主管|
| 五六七八|斯泰西·琼斯|总裁|2015-09-03 2015-09-03|主管|
| 五六七八|斯泰西·琼斯|副总裁|2014年9月1日|主管|
| 五六七八|斯泰西·琼斯|工作人员|2013-09-01 2013-09-01|非主管|
下面是我期望的输出:
| ID|员工|职位_职称|主管_开始|主管_结束|
| --------------|--------------|--------------|--------------|--------------|
| 一二三四|约翰·亚当斯|总裁|2020-01-01 2020-01-01||
| 一二三四|约翰·亚当斯|副总裁|2012-01-01 2012-01-01|2014-01-05 2014-01-05|
| 一二三四|斯泰西·琼斯|总裁|2014年9月1日||
1条答案
按热度按时间kqqjbcuj1#
在Oracle 12中,可以使用
MATCH_RECOGNIZE
执行逐行模式匹配:其中,对于样本数据:
输出:
| 员工|ID|职位_头衔|主管_开始|主管_结束|
| --------------|--------------|--------------|--------------|--------------|
| 约翰·亚当斯|一二三四|副总裁|2012-01-01 00:00:00|2014-06-01 00:00:00|
| 约翰·亚当斯|一二三四|总裁|2020-01-01 00:00:00|联系我们|
| 斯泰西·琼斯|一二三四|总裁|2015-03-09 00:00:00|联系我们|
对于
supervisor_end
,如果您想要范围的最后日期,而不是下一个范围的下一个日期,则使用LAST(effective_date)
代替NEXT(effective_date)
。它将输出:
| 员工|ID|职位_头衔|主管_开始|主管_结束|
| --------------|--------------|--------------|--------------|--------------|
| 约翰·亚当斯|一二三四|副总裁|2012-01-01 00:00:00|2013-01-01 00:00:00|
| 约翰·亚当斯|一二三四|总裁|2020-01-01 00:00:00|2020-05-01 00:00:00|
| 斯泰西·琼斯|一二三四|总裁|2015-03-09 00:00:00|2018-02-01 00:00:00|
fiddle