希望检查是否根据合同重新聘用了员工。如果重新聘用了他,则返回重新聘用期间。如果重新聘用了多名员工,则返回他们的所有重新聘用期间。
Sample data:(Table 'Contract')
Employee_id Period Contract
111 202204 1NA
111 202205 1NA
111 202206 1NA
112 202207 1NA
112 202208 1NA
111 202209 1NA
在上述情况下,输出应该是,
Employee_id Period Contract
111 202209 1NA
查询应该首先检查员工是否被重新雇用,如果是,则返回重新雇用期间。如果该合同没有重新雇用,则返回NULL。
任何其他逻辑以外的滞后n领先也将不胜感激!
提前感谢:)
Image of the sample data
3条答案
按热度按时间ebdffaop1#
使用
LAG
来识别是否为上一个期间间隔,然后仅选择间隔〉1的期间请注意,您的样本数据只有同一年内的时段。如果时段跨年,则此示例将失败。
要解决这个问题,请创建一个伪“periods”表,用行号标识连续的行:
zbwhf8kr2#
答复(在评论之后)在末尾.。
目前尚不清楚此示例数据的预期结果是什么:
两个样本员工都有多个连续期间。其中一个选项是显示具有多个期间的员工的第一个期间和最后一个期间:
......另一个可能是向所有人展示:
...如果您希望LEAD()函数也是如此
它几乎是一样的-只是显示下一个周期而不是上一个周期。
注:如根据某合约重新聘用指同一合约,则─
OVER(按EMP_ID、合同...划分)
相反操作(非连续时段):
x8goxv8g3#
在Oracle 12中,可以使用
MATCH_RECOGNIZE
执行逐行模式匹配:其中,对于示例数据:
输出:
| 电磁脉冲标识|周期|合同|
| - ------| - ------| - ------|
| 一百一十一|小行星202| 1NA|
fiddle