请计算出每个人的每一段工作履历(对于二进宫的按照多段列出),写出对应的Oracle sql
时间: 2024-10-14 15:16:25 浏览: 38
在Oracle中,如果你有一个包含员工ID、雇佣开始日期 (`hire_date`) 和雇佣结束日期 (`termination_date`) 的历史记录表 (比如 `employment_history`),你可以使用窗口函数来按员工分组并计算他们每一段连续的工作时期。这里假设 `hire_date` 和 `termination_date` 都是日期类型。
```sql
WITH
-- 创建一个视图,用于找出每段连续的工作时期
employee_segments AS (
SELECT
employee_id,
hire_date,
termination_date,
ROW_NUMBER() OVER (
PARTITION BY employee_id
ORDER BY hire_date, termination_date
) AS segment_id
FROM
employment_history
),
-- 计算每个员工的各段工作经历
segment_details AS (
SELECT
employee_id,
hire_date,
termination_date,
lead(hire_date, 1) OVER (PARTITION BY employee_id ORDER BY hire_date) - 1 AS next_hire_date,
lead(termination_date, 1) OVER (PARTITION BY employee_id ORDER BY termination_date) AS next_term_date
FROM
employee_segments
)
SELECT
employee_id,
hire_date,
termination_date,
CASE
WHEN next_hire_date IS NULL THEN 'End of data'
ELSE next_hire_date
END AS end_of_current_segment,
next_term_date AS start_of_next_segment
FROM
segment_details
WHERE
next_term_date IS NOT NULL;
```
这个查询首先将每个员工的工作记录分为独立的段(`employee_segments`视图),然后在`segment_details`视图中计算每个段的结束和下一个段的开始日期。
注意:这个查询假设了所有终止日期之后没有新的雇佣记录,如果有新的雇佣记录,则需要进一步处理。另外,这个查询可能会导致最后一个工作段的 `end_of_current_segment` 丢失,因为它是基于当前行后面的雇佣日期。你可以根据实际需求调整查询。
阅读全文