2016-10-27 2 views
0

Если я беру даты из группы B, то мне нужно найти максимальную разницу между любыми двумя последовательными датами из группы B и отобразить это days_difference как отдельный столбец. Также вы хотите отобразить эти две даты в двух разных столбцах с максимальным значением days_difference.разница между датами в той же группе

Условие: Два идентификатора класса могут иметь одинаковое имя класса в данных. Как вы видите, Class-ID 1238 и 1252 имеют одинаковое имя класса. Вывод должен быть для каждого класса-ид

Так результат должен иметь: ClassID, ClassName, Дата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

Вывод должен быть для каждого идентификатора класса в таблице. Например, если вы берете class-id 1252, тогда запрос должен фактически пересекать все даты для id-1252 и находить разницу между двумя последовательными датами, которые имеют максимальное значение days_difference для id-1252. То же самое для других идентификаторов класса в таблице. Прошу прощения, если вопрос был немного запутанным. –

ответ

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. Если в таблице t есть 500 различных идентификаторов классов, я получаю 650 строк в конечном результате, а не получаю 500 –

+0

Итак, в ваших данных У вас есть несколько ClassName для одного и того же ClassId. В ваших примерах у нас не было таких строк. Я не знаю, что вы хотите в этой ситуации, но я подозреваю, что вам нужно удалить 'classname' в разделе' partition by'. В зависимости от логики - вы должны делать это везде или только в подзапросе 't2'. –

Смежные вопросы