首页 > 解决方案 > 如何在最小和最大日期创建 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

标签: sqloracleoracle12c

解决方案


这是日期链的一种差距和孤岛问题。我建议使用 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;

推荐阅读