sql - 如何在最小和最大日期创建 GROUP BY
问题描述
我有一个这样的数据库表
emp_id start-date end_date title location
111 1-JAN-2000 31-DEC-2003 MANAGER NYO
111 1-JAN-2003 31-DEC-2005 MANAGER BOM
111 1-JAN-2006 31-DEC-2007 CFO NYO
111 1-JAN-2008 31-DEC-2015 MANAGER NYO
我已经用 GROUP BY 和 min , max 函数创建了一个 SQL 代码
select emp_id,min(start_date),max(end_date),title
from table1
group by emp_id,title
期望的是:
111 1-JAN-2000 31-DEC-2005 MANAGER
111 1-JAN-2006 31-DEC-2007 CFO
111 1-JAN-2008 31-DEC-2015 MANAGER
我得到的是:
111 1-JAN-2000 31-DEC-2015 MANAGER
111 1-JAN-2006 31-DEC-2007 CFO
解决方案
这是日期链的一种差距和孤岛问题。我建议使用 aleft join
来查找岛屿的起点。然后是累积总和和聚合:
select emp_id, title, min(start_date), max(end_date)
from (select t.*,
sum(case when tprev.emp_id is null then 1 else 0 end) over
(partition by t.emp_id, t.title order by t.start_date) as grouping
from t left join
t tprev
on t.emp_id = tprev.emp_id and
t.title = tprev.title and
t.start_date = tprev.end_date + 1
) t
group by grouping, emp_id, title;
推荐阅读
- python - 未找到时字符串上字符的 Python3 索引
- vba - 使用 If 条件循环
- javascript - 为什么我们需要在 react 中使用 redux
- javascript - Discord 机器人仍然在一个事件上多次回答
- jquery - Bootstrap 4 不适用于 Bootstrap 选择
- javascript - 从 Firebase Angular 5 访问 id 接收所有数据
- perl - 为什么下面的代码没有按预期工作?
- java - 多个服务之间的 CQRS 事件
- c++ - 如何在 Eclipse C++ 中为文件系统添加 -lstdc++fs?
- python - Pandas:如何根据表示两列值的元组列表从数据框中删除行?