oracle sql中按日期分组的数据
我有一张桌子oracle sql中按日期分组的数据,oracle,date,Oracle,Date,我有一张桌子 Create table t ( employee varchar2(10), job varchar2(5), start_date date, end_date date, FTE number ); 有了这些数据: 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);
Create table t (
employee varchar2(10),
job varchar2(5),
start_date date,
end_date date,
FTE number
);
有了这些数据:
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);
我希望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()
函数的差异创建了应用标准聚合之前所需的额外分组标志
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.
巴迪:你有一个错误的开始括号
(
在表声明的列名job
之前。日期至少应该是字符串,用单引号括起来”
,即使您依赖sessionnls\u date\u格式
。您如何将92.429插入声明的列int
?+1以提供可用格式的测试数据?但是-0.5谢谢你在发帖前没有亲自测试。太棒了!我正在研究并试图回答这个问题,刚刚发现了这个Tabibitosan方法。我会记住这个技巧。谢谢,抱歉出错。我还有一个问题。答案很好,我自己也在查这个问题。这在将来会很有用。我有一个另一个问题。我们能否在12个月内显示FTE。在本例中,结果将类似于1111,1,19-MAY-2008,19-MAY-2009100……@NeenaAlbi-这是一个不同的问题(即使它基于相同的数据)。您应该打开一个新的线程/问题,引用此线程/问题以获取输入数据,并解释您提出的问题不同。