2016-10-27 23 views
0

グループBから日付を取得すると、グループBから2つの連続する日付の間に最大の差異があり、その日数差を別の列として表示する必要があります。また、これらの2つの日付を最大days_differenceを持つ2つの異なる列に表示したいとします。同じグループ内の日付の差

条件:2つのクラスIDが同じクラス名を持つ可能性があります。あなたが見ることができるように、Class-ID 1238と1252は同じClass-Nameを持っています。出力は、すべてのクラスIDのためにあるべき

ので、持っている必要があり結果:のClassID、クラス名、日付1、日付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 
+2

予想される出力の完全な有効な表と、これまでに試したことを示してください。あなたは "グループ"について話しますが、あなたの例では "グループ"という名前はありません。 「CLassName?」という意味ですか?質問を掲示する際に具体的で正確であるようにしてください。 – OldProgrammer

+0

サンプル入力データがある場合、結果はどのように見えますか?あなたのロジックは私には分かりません。私はあなたが 'LAG()'解析関数を見たいと思っていると思います。 – Boneist

+0

出力は、表内のすべてのクラスIDに対して行う必要があります。たとえば、class-id 1252を指定すると、クエリは実際にid-1252のすべての日付をトラバースし、id-1252の最大日数差を持つ2つの連続する日付の差を見つけます。テーブル内の他のクラスIDについても同様です。質問がちょっと混乱していたらごめんなさい。 –

答えて

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 
+0

ありがとうございます!しかし問題は、私のケースではCLASS-IDが重複していることです。テーブルtに500の別個のクラスIDがある場合は、最終結果として500を得るのではなく、650行を取得します。 –

+0

データ内に同じClassIdに対して複数のClassNameがあります。あなたの例では、そのような行はありませんでした。 私はあなたがこの状況で何をしたいのかわかりませんが、 'partition by'節で' classname'を削除しなければならないと思います。 すべてのロジックに依存 - どこでもか、サブクエリ 't2'でのみ行う必要があります。 –

関連する問題