【问题标题】:Data grouped by date in oracle sql [closed]oracle sql中按日期分组的数据[关闭]
【发布时间】:2017-02-17 21:23:36
【问题描述】:

我有一张桌子

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 发生更改的时间以及更改发生时的相应开始日期和结束日期。

【问题讨论】:

  • 好友:您在表声明中的列名 job 之前有一个错误的左括号 (。日期至少应该是字符串,用单引号 ' 括起来,即使您依赖会话 nls_date_format。以及如何将 92.429 插入声明为 int 的列中? +1 用于提供可用格式的测试数据;但 -0.5 表示在发布之前没有自己测试。

标签: oracle date


【解决方案1】:

这是 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.

【讨论】:

  • 太棒了!我正在研究并试图回答这个问题,并且刚刚发现了这种 Tabibitosan 方法。我会记住这个技巧。
  • 谢谢,错误抱歉。我还有一个问题。
  • 很好的答案,我自己正在寻找这个。这在将来会有用。
  • 我还有一个问题。我们可以在 12 个月内显示 FTE。在示例中,结果将类似于 1111,1,19-MAY-2008,19-MAY-2009,100.......
  • @NeenaAlbi - 这是一个不同的问题(即使它是在相同的数据上)。你应该打开一个新的线程/问题,引用这个输入数据,并解释你在问一个不同的问题。
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2015-02-25
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
相关资源
最近更新 更多