2013-06-01 2 views
-1

У меня есть запрос со следующим результатом:Ранжирование базы на две даты в Oracle

Я думал, что я мог бы использовать dense_rank групповому пользовательского сегмента в интервале времени. Но это не сработает.

CUST_ID EVENT_ID SEGMENT_ID SEGMENT_CODE  DATE_FROM    DATE_TO 
100  1424  21   A   2011.01.05. 13:03:12 2011.01.06. 23:40:13 
100  1566  21   A   2011.01.06. 23:40:13 2011.02.28. 11:48:52 
100  1580  21   A   2011.02.28. 11:48:52 2012.04.30. 2:49:53 
100  1601  45   Y   2012.04.30. 2:49:53 2012.05.29. 21:12:27 
100  1663  45   Y   2012.05.29. 21:12:27 2012.05.30. 11:11:23 
100  1710  45   Y   2012.05.30. 11:11:23 2012.08.01. 5:14:36 
100  1875  114   H   2012.08.01. 5:14:36 2012.09.01. 20:26:42 
100  1880  33   F   2012.09.01. 20:26:42 2012.09.03. 9:12:23 
100  1901  21   A   2012.09.03. 9:12:23 2012.09.03. 9:12:23 
100  1903  21   A   2012.09.03. 9:12:23 2012.10.25. 17:25:14 
100  1966  223   R   2012.10.25. 17:25:14 2013.01.01. 1:12:55 
100  2011  223   R   2013.01.01. 1:12:55 3500:12:31. 23:59:59 

Я хотел бы что-то вроде этого:

CUST_ID EVENT_ID SEGMENT_ID SEGMENT_CODE  DATE_FROM    DATE_TO   DENSE_RANK 
100  1424  21   A   2011.01.05. 13:03:12 2011.01.06. 23:40:13  1 
100  1566  21   A   2011.01.06. 23:40:13 2011.02.28. 11:48:52  1 
100  1580  21   A   2011.02.28. 11:48:52 2012.04.30. 2:49:53  1 
100  1601  45   Y   2012.04.30. 2:49:53 2012.05.29. 21:12:27  2 
100  1663  45   Y   2012.05.29. 21:12:27 2012.05.30. 11:11:23  2 
100  1710  45   Y   2012.05.30. 11:11:23 2012.08.01. 5:14:36  2 
100  1875  114   H   2012.08.01. 5:14:36 2012.09.01. 20:26:42  3 
100  1880  33   F   2012.09.01. 20:26:42 2012.09.03. 9:12:23  4 
100  1901  21   A   2012.09.03. 9:12:23 2012.09.03. 9:12:23  5 
100  1903  21   A   2012.09.03. 9:12:23 2012.10.25. 17:25:14  5 
100  1966  223   R   2012.10.25. 17:25:14 2013.01.01. 1:12:55  6 
100  2011  223   R   2013.01.01. 1:12:55 3500:12:31. 23:59:59  6 

Есть ли у вас какие-либо идеи, как я могу решить эту проблему?

+0

Какой запрос вы пробовали? Что-то вроде 'DENSE_RANK() OVER (PARTITION BY SEGMENT_ID ORDER BY DATE_FROM)" dense_rank "'? Неясно, что вы намерены «сегментом пользователя за промежуток времени» ... – EmirCalabuch

+0

Что означает «не работает»? Как выглядит ваш запрос? Что с этим не так? Вы получаете сообщение об ошибке? Неверные данные? Какова логика вашего вывода? Почему ваш вывод идентичен вашему вводу? – Ben

+0

Не могу объяснить правильно. Но я попробую. В запросе показан один период жизни сегмента клиента. – Shylock

ответ

0

Основываясь на вашей логике, dense_rank не будет делать. Однако вы можете получить аналогичный эффект с lag() и суммарной суммой. Задержка смотрит на предыдущее значение даты для сегмента id/сегмента кода, если они перекрываются, то запись не является началом группировки. Иначе это так.

Совокупная сумма «isstarts» является то, что вы ищете:

select t.*, 
     sum(case when date_from - prev_date_to < 0.00001 
       then 0 
       else 1 
      end) over (partition by segment_id order by SEGMENT_ID, SEGMENT_CODE 
        ) as YourRanking 
from (select t.*, 
      lag(date_to) over (partition by SEGMENT_ID, SEGMENT_CODE 
           order by date_from 
           ) as prev_date_to 
     from t 
    ) t 

Поскольку это дата/время, запрос не использует точное равенство. Вместо этого он ищет небольшую разницу.

+0

Извините за очень поздний повтор. Это была отличная идея. Я мог бы использовать его и исправил проблему! – Shylock