如果我从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
答案 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