2016-10-25 7 views
0

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

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

Так результат должен иметь: ClassID, ИмяКласса, Date1, дата 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

Что такое "Группа B"? Ничто в вашем примере данных не относится к этому. –

+0

Прошу прощения. На самом деле вы можете рассматривать ClassID только в этом случае и считать его группой. –

ответ

0

вы можете получить разницу в день между последовательными датами путем использования LEAD или LAG.

SELECT 
    Dates, 
    LEAD(Dates) OVER (PARTITION BY ClassID ORDER BY Dates) NextDate, 
    Dates - LEAD(Dates) OVER (PARTITION BY ClassID ORDER BY Dates) DaysDiff 
FROM MyTable 

вы можете получить результат, который вы хотите от этого результата, принимая запись с наибольшим значением DaysDiff

for reference

ранжировать результаты и получить высокий рейтинг даты диф за Classid.

SELECT * FROM (
    SELECT *, RANK() OVER (PARTITION BY ClassID ORDER BY DaysDiff DESC) Rnk 
    FROM (
     SELECT 
      ClassID, 
      ClassName, 
      Dates, 
      LEAD(Dates) OVER (PARTITION BY ClassID ORDER BY Dates) NextDate, 
      Dates - LEAD(Dates) OVER (PARTITION BY ClassID ORDER BY Dates) DaysDiff 
     FROM MyTable) t1 
    ) t2 
WHERE t2.Rnk = 1 

вывод для вышеуказанных данных образца должен быть.

ClassName ClassID  Dates     NextDate    DaysDiff Rnk 
--------- ----------- ----------------------- ----------------------- ----------- -------------------- 
ClassA 1238  2012-06-29 00:00:00.000 2016-06-21 00:00:00.000 1453  1 
ClassA 1252  2011-04-15 00:00:00.000 2013-12-29 00:00:00.000 989   1 
ClassC 1261  2005-09-02 00:00:00.000 2010-08-13 00:00:00.000 1806  1 
+0

Но я хочу разницу, которая является максимальной между последовательными датами. Не вычислять разницу между всеми последовательными датами и отображать ее. –

+0

@RohitJachak Я просто дал вам отправную точку, но я обновил ответ, чтобы использовать функцию RANK, чтобы получить записи с наивысшими показателями даты. – JamieD77

+0

Я действительно полностью обновил вопрос. Приносим извинения за неудобства. –

0
SELECT A.ClassId, 
     B.LagDates, 
     B.Dates 
    FROM 
    (
     SELECT ClassId, 
       MAX(DaysDiff) AS MD 
      FROM 
       (  
       SELECT *, 
         LAG(Dates, 1) OVER (PARTITION BY ClassID ORDER BY Dates) AS LagDates, 
         TO_DATE(Dates, 'YYYY-MM-DD') 
         - 
         LAG(Dates, 1) OVER (PARTITION BY ClassID ORDER BY  
         Dates) AS DaysDiff 
        FROM (SELECT *          
          FROM Table 
          ORDER BY ClassId, Dates 
         ) 
       ) 
     GROUP BY ClassId 
    ) A, 
     (
      SELECT *, 
       LAG(Dates, 1) OVER (PARTITION BY ClassID ORDER BY Dates) AS LagDates, 
       TO_DATE(Dates, 'YYYY-MM-DD') 
       - 
       LAG(Dates, 1) OVER (PARTITION BY ClassID ORDER BY Dates) 
       AS DaysDiff 
      FROM (
        SELECT * 
         FROM Table 
        ORDER BY ClassId, Dates 
       ) 
     ) B 
WHERE A.ClassId = B.ClassId 
    AND A.MD = B.DaysDiff; 
+0

Что делать, если мне нужно присоединиться к двум таблицам? Где я должен указать условие соединения? –

+0

@RohitJachak - вы указываете свое условие соединения, в котором оно находится. В вашем первоначальном вопросе не было упоминаний о присоединении, почему вы сохраняете такую ​​информацию до тех пор, пока люди не ответят на ваш вопрос? Что вам нужно, чтобы присоединиться - таблица на ваших вкладках? Вывод этого запроса? Что-то между ними? – mathguy

+0

@Teja Привет. Я полностью обновил этот вопрос. Приносим извинения за неудобства. –