sql - 如何为不同员工职位的一系列Oracle分配日期记录编写sql脚本
问题描述
我正在尝试按员工的职位为一系列分配日期记录编写一个临时查询。这些示例用于 Oracle 应用程序分配表。
第一个样本:
AsgId Start_Date End_Date Job_ID
1 1/1/14 6/30/14 10
1 7/1/14 11/15/14 10
1 11/16/14 1/10/15 20
1 1/11/15 3/10/15 10
1 3/11/15 3/31/15 10
1 4/1/15 12/31/18 20
我尝试过分析函数、内联视图和其他代码,但均未成功。
按职位划分的 3 个日期范围记录的预期报告结果:
asgid start_date end_date job_title
1 1/1/14 11/15/14 10
1 11/16/14 1/10/15 20
1 1/11/15 3/31/15 10
1 4/1/15 12/31/18 20
第二个样本:
EMP_ID START_DATE END_DATE JOB_TITLE
1 1/1/14 11/15/14 10
1 11/16/14 11/10/15 10
1 11/11/15 12/31/15 20
1 1/1/16 1/31/16 10
1 2/1/16 12/31/16 10
按职位划分的 3 个日期范围记录的预期报告结果
EMP_ID START_DATE END_DATE JOB_TITLE
1 1/1/14 11/10/15 10
1 11/11/15 12/31/15 20
1 1/1/16 12/31/16 10
解决方案
这是一种差距和孤岛问题。假设没有间隙或重叠,您可以使用left join
和 累积和来确定岛屿。剩下的就是聚合:
select asgid, job_id, min(start_date) as start_date,
max(end_date) as end_date
from (select a.*,
sum(case when aprev.asgid is null then 1 else 0 end) over (partition by a.asgid, a.job_id order by a.start_date) as grp
from assignment a left join
assignment aprev
on aprev.asgid = a.asgid and
aprev.job_id = a.job_id and
aprev.end_date = a.start_date - 1
) a
group by asgid, job_id, grp
order by asgid, min(a.start_date);
这是一个 db<>fiddle。
推荐阅读
- java - 从在线文本文件的列表中查找随机名称
- python - 使用 GLib.source_remove() 避免来自 GLib 的警告
- reporting-services - SSRS 导出到 MHTML 不显示基于可见性设置的元素
- sql - 如何完成列值
- c++11 - C++ ScopeTimer 不起作用
- awk - 如何用该字母替换多次出现的字母?
- vb.net - 如何在列表框中堆叠 mp3 文件
- java - 多个登录 URL Spring Security
- c - 输出窗口中的 UTF-8 字符编辑不正确
- python - 如何将切片对象的负索引解析为 argparse.ArgumentParser