数据按日期分组在oracle sql中 [英] Data grouped by date in oracle sql

查看:304
本文介绍了数据按日期分组在oracle sql中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表t

 创建表t(
employee varchar2(10),
job varchar2(5),
start_date date,
end_date date,
FTE number
);

其中包含此数据:

 插入t值(1111,1,19-May-2008,18-May-2010,100); 
插入t值(1111,1,19-May-2010,30-Jun-2010,100);
插入t值(1111,1,01-Jul-2010,13-Feb-2011,100);
插入t值(1111,1,14-Feb-2011,13-Feb-2012,100);
插入t值(1111,1,14-Feb-2012,13-Feb-2013,100);
插入t值(1111,1,14-Feb-2013,27-Nov-2013,100);
插入t值(1111,1,15-Nov-2013,27-Nov-2013,100);
insert into t values(1111,1,28-Nov-2013,24-Aug-2014,60);
插入t值(1111,1,25-Aug-2014,24-Aug-2015,60);
insert into t values(1111,1,15-Nov-2014,24-Aug-2015,60);
插入t值(1111,1,25-Aug-2015,14-Nov-2015,68.571);
插入t值(1111,1,15-Nov-2015,31-Mar-2016,68.571);
insert into t values(1111,1,01-Apr-2016,11-Sep-2016,68.571);
insert into t values(1111,1,12-Sep-2016,29-Sep-2016,72.857);
insert into t values(1111,1,30-Sep-2016,10-Nov-2016,91.429);
插入t值(1111,1,11-Nov-2016,14-Nov-2016,100);
插入t值(1111,1,15-Nov-2016,23-Apr-2017,100);
插入t值(1111,1,24-Apr-2017,14-Jan-2018,60);
插入t值(1111,1,15-Jan-2018,31-May-2019,71.429);
插入t值(1111,1,01-Jun-2019,31-Dec-2049,100);

我希望通过正确的开始日期和结束日期将FTE数据分组显示,使其看起来像这个

  1111 1 19/05/2008 27/11/2013 100 
1111 1 28/11/2013 24 / 08/2015 60
1111 1 25/08/2015 11/09/2016 68.571
1111 1 12/09/2016 29/09/2016 72.857
1111 1 30/09/2016 10/11/2016 91.429
1111 1 11/11/2016 23/04/2017 100
1111 1 24/04/2017 14/01/2018 60
1111 1 15/01 / 2018 31/05/2019 71.429
1111 1 1/06/2019 31/12/2049 100

我该怎么做?我想要做的是列出当更改发生时相应的开始日期和结束日期发生了FTE的更改。

解决方案

这是Tabibitosan方法的一个直接应用,用于在序列中查找连续行的集合。两个分析 row_number()函数的区别在应用标准聚合之前创建了所需的附加分组标志。



<$ p $作为end_date选择employee,job,min(start_date)作为start_date,max(end_date),从(select employee,job,start_date,end_date,FTE,
row_number)中选择FTE
()((由雇员划分,由job_date指定的作业) -
row_number()(由employee分配,job,FTE按start_date命令)
作为grp
从t

按员工,工作,FTE,grp
按员工顺序,start_date
;


雇员工作START_DATE END_DATE FTE
---------- ----- ----------- --- -------- ----------
1111 1 2008年5月19日至2013年11月27日
1111 1 2013年11月28日24-Aug- 2015 60
1111 1 2015年8月25日至2016年6月6日68.571
1111 1 2016年9月12日 - 2016年9月29日72.857
1111 1 2016年9月30日10-Nov -2016 91.429
1111 1 2011年11月11日至2017年01月23日100
1111 1 - 2017年4月14日至2018年6月14日
1111 1 2011年1月15日31- May-2019 71.429
1111 1 01-Jun-2019 31-Dec-2049 100

选择9行。


I have a table t

Create table t (
  employee varchar2(10), 
  job varchar2(5), 
  start_date date, 
  end_date date, 
  FTE number
);

with this data in it:

insert into t values (1111,1,19-May-2008,18-May-2010,100);
insert into t values (1111,1,19-May-2010,30-Jun-2010,100);
insert into t values (1111,1,01-Jul-2010,13-Feb-2011,100);
insert into t values (1111,1,14-Feb-2011,13-Feb-2012,100);
insert into t values (1111,1,14-Feb-2012,13-Feb-2013,100);
insert into t values (1111,1,14-Feb-2013,27-Nov-2013,100);
insert into t values (1111,1,15-Nov-2013,27-Nov-2013,100);
insert into t values (1111,1,28-Nov-2013,24-Aug-2014,60);
insert into t values (1111,1,25-Aug-2014,24-Aug-2015,60);
insert into t values (1111,1,15-Nov-2014,24-Aug-2015,60);
insert into t values (1111,1,25-Aug-2015,14-Nov-2015,68.571);
insert into t values (1111,1,15-Nov-2015,31-Mar-2016,68.571);
insert into t values (1111,1,01-Apr-2016,11-Sep-2016,68.571);
insert into t values (1111,1,12-Sep-2016,29-Sep-2016,72.857);
insert into t values (1111,1,30-Sep-2016,10-Nov-2016,91.429);
insert into t values (1111,1,11-Nov-2016,14-Nov-2016,100);
insert into t values (1111,1,15-Nov-2016,23-Apr-2017,100);
insert into t values (1111,1,24-Apr-2017,14-Jan-2018,60);
insert into t values (1111,1,15-Jan-2018,31-May-2019,71.429);
insert into t values (1111,1,01-Jun-2019,31-Dec-2049,100);

I want the FTE data to be displayed grouped by correct startdate and end date , so that it appears like this

1111    1   19/05/2008  27/11/2013  100 
1111    1   28/11/2013  24/08/2015  60
1111    1   25/08/2015  11/09/2016  68.571
1111    1   12/09/2016  29/09/2016  72.857
1111    1   30/09/2016  10/11/2016  91.429 
1111    1   11/11/2016  23/04/2017  100
1111    1   24/04/2017  14/01/2018  60 
1111    1   15/01/2018  31/05/2019  71.429
1111    1   1/06/2019   31/12/2049  100

How can I do this? What I was trying to do was to list when a change in FTE was occurred with corresponding start date and end date when the change occurred.

解决方案

This is a direct application of the Tabibitosan method for finding sets of "consecutive" rows in sequences. The difference of two analytic row_number() functions creates the additional grouping flag needed before we apply standard aggregation.

select   employee, job, min(start_date) as start_date, max(end_date) as end_date, FTE
from     ( select employee, job, start_date, end_date, FTE,
                  row_number() over (partition by employee, job      order by start_date) -
                  row_number() over (partition by employee, job, FTE order by start_date) 
                                                                                    as grp
           from t
         )
group by employee, job, FTE, grp
order by employee, start_date
;


EMPLOYEE   JOB   START_DATE  END_DATE           FTE
---------- ----- ----------- ----------- ----------
1111       1     19-May-2008 27-Nov-2013        100
1111       1     28-Nov-2013 24-Aug-2015         60
1111       1     25-Aug-2015 11-Sep-2016     68.571
1111       1     12-Sep-2016 29-Sep-2016     72.857
1111       1     30-Sep-2016 10-Nov-2016     91.429
1111       1     11-Nov-2016 23-Apr-2017        100
1111       1     24-Apr-2017 14-Jan-2018         60
1111       1     15-Jan-2018 31-May-2019     71.429
1111       1     01-Jun-2019 31-Dec-2049        100

9 rows selected.

这篇关于数据按日期分组在oracle sql中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆