【发布时间】:2021-12-27 03:45:54
【问题描述】:
我正在尝试从员工列表中获取工作编号。如果他们多年来没有调动部门,那么这应该被视为一份工作。一旦他们搬到一个新部门,那应该被视为一份新工作。我面临的问题是,如果他们搬回一个部门,我的要求也应该被视为一份新工作。所以流程会是这样的:
- 销售 -> 工作 1
- IT -> 工作 2
- 销售 -> 工作 3
- 营销 -> 工作 4。
我在下面做了一个超级简化的查询来展示我想要实现的目标:
SELECT RANK() OVER(ORDER BY last_year_in_role) JOB_NO, name, Role
FROM
(
SELECT MAX(years_at_company) last_year_in_role, Name, Role
FROM (
SELECT 'Bob' name, 1 years_at_company, 'Sales' role FROM DUAL
UNION
SELECT 'Bob', 2, 'Sales' FROM DUAL
UNION
SELECT 'Bob', 3, 'Sales' FROM DUAL
UNION
SELECT 'Bob', 4, 'IT' FROM DUAL
UNION
SELECT 'Bob', 5, 'Sales' FROM DUAL
UNION
SELECT 'Bob', 6, 'Marketing' FROM DUAL
)
GROUP BY Name, Role
)
;
这会产生以下结果:
这是错误的,因为它总是将 SALES 中的所有时间组合在一起,即使数据中存在中断。我觉得这个问题可能可以通过以某种方式在 ROLE 上进行分区的 WINDOW 函数来解决,但我没有成功。
【问题讨论】:
-
这是一个差距和孤岛问题,每个部门的变化都应该被视为“海滩”。
-
@TheImpaler,谢谢!这让我可以开始谷歌搜索。
-
@stickybit 我写的查询是最小的可重现示例。跑步会产生我遇到的问题。
-
@LennyMeerwood:公平点,我的错。
标签: sql oracle gaps-and-islands