をコメントで述べたように、あなたがここに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
予想される出力の完全な有効な表と、これまでに試したことを示してください。あなたは "グループ"について話しますが、あなたの例では "グループ"という名前はありません。 「CLassName?」という意味ですか?質問を掲示する際に具体的で正確であるようにしてください。 – OldProgrammer
サンプル入力データがある場合、結果はどのように見えますか?あなたのロジックは私には分かりません。私はあなたが 'LAG()'解析関数を見たいと思っていると思います。 – Boneist
出力は、表内のすべてのクラスIDに対して行う必要があります。たとえば、class-id 1252を指定すると、クエリは実際にid-1252のすべての日付をトラバースし、id-1252の最大日数差を持つ2つの連続する日付の差を見つけます。テーブル内の他のクラスIDについても同様です。質問がちょっと混乱していたらごめんなさい。 –