同一组中的日期之间的差异

时间:2016-10-27 13:18:43

标签: sql oracle group-by datediff date-difference

如果我从B组中取出日期,那么我必须找到B组中任意两个连续日期之间的最大差异,并将days_difference显示为单独的列。还想在两个具有最大days_difference的不同列中显示这两个日期。

条件:两个类ID在数据中可能具有相同的类名。如您所见,Class-ID 1238和1252具有相同的Class-Name。输出应该是每个class-id

所以结果应该是:ClassID,ClassName,Date1,Date 2,DateDiff

ClassName | Dates     | ClassID  | Spend($)
ClassA    | 21-Jun-16 | 1238     | 1
ClassA    | 27-Jun-16 | 1238     | 2
ClassA    | 14-Apr-11 | 1252     | 3
ClassA    | 15-Apr-11 | 1252     | 4
ClassC    | 26-Oct-15 | 1261     | 5
ClassC    | 21-Oct-15 | 1261     | 6
ClassA    | 10-Dec-10 | 1252     | 21
ClassC    | 15-Dec-14 | 1261     | 23
ClassC    | 15-May-14 | 1261     | 34
ClassA    | 10-Jan-09 | 1252     | 54
ClassA    | 12-Jun-09 | 1238     | 65
ClassA    | 29-Jun-12 | 1238     | 76
ClassA    | 11-Apr-08 | 1252     | 87
ClassA    | 01-Apr-16 | 1252     | 56
ClassC    | 16-Oct-16 | 1261     | 43
ClassC    | 02-Sep-05 | 1261     | 33
ClassA    | 29-Dec-13 | 1252     | 77
ClassC    | 13-Dec-15 | 1261     | 87
ClassC    | 13-Aug-10 | 1261     | 98
ClassA    | 21-Jan-14 | 1252     | 12

1 个答案:

答案 0 :(得分:0)

如评论中所述,您可以在此处使用lag()功能,然后过滤具有最大日期差异的行:

with t1 as (select classname, classid, 
                   lag(dates) over (partition by classname, classid 
                                        order by dates) dt1, 
                   dates dt2, 
                   dates - lag(dates) over (partition by classname, classid 
                                                order by dates) diff
              from t ),
     t2 as (select classname, classid, dt1, dt2, diff, 
                   max(diff) over (partition by classname, classid) mdiff
              from t1)
select classname, classid, dt1, dt2, diff
  from t2 
  where diff = mdiff
  order by classname, classid

测试数据和输出:

create table t (classname varchar2(8), dates date, classid number(5), spend number(3));
insert into t values ('ClassA', date '2016-06-21', 1238,  1);
insert into t values ('ClassA', date '2016-06-27', 1238,  2);
insert into t values ('ClassA', date '2011-04-14', 1252,  3);
insert into t values ('ClassA', date '2011-04-15', 1252,  4);
insert into t values ('ClassC', date '2015-10-26', 1261,  5);
insert into t values ('ClassC', date '2015-10-21', 1261,  6);
insert into t values ('ClassA', date '2010-12-10', 1252, 21);
insert into t values ('ClassC', date '2014-12-15', 1261, 23);
insert into t values ('ClassC', date '2014-05-15', 1261, 34);
insert into t values ('ClassA', date '2009-01-10', 1252, 54);
insert into t values ('ClassA', date '2009-06-12', 1238, 65);
insert into t values ('ClassA', date '2012-06-29', 1238, 76);
insert into t values ('ClassA', date '2008-04-11', 1252, 87);
insert into t values ('ClassA', date '2016-04-01', 1252, 56);
insert into t values ('ClassC', date '2016-10-16', 1261, 43);
insert into t values ('ClassC', date '2005-09-02', 1261, 33);
insert into t values ('ClassA', date '2013-12-29', 1252, 77);
insert into t values ('ClassC', date '2015-12-13', 1261, 87);
insert into t values ('ClassC', date '2010-08-13', 1261, 98);
insert into t values ('ClassA', date '2014-01-21', 1252, 12);

CLASSNAME CLASSID DT1         DT2               DIFF
--------- ------- ----------- ----------- ----------
ClassA       1238 2012-06-29  2016-06-21        1453
ClassA       1252 2011-04-15  2013-12-29         989
ClassC       1261 2005-09-02  2010-08-13        1806