2015-10-02 2 views
-1

Я борюсь на запрос данных, как в примереКак запрашивать данные с Oracle 11

---------- 
Date of Transaction Customer_ID Customer_Register_Status 
20/09/2015   123    NEW 
21/09/2015   123    Activate 
22/09/2015   123    Activate 
23/09/2015   123    Suspense 
24/09/2015   123    Suspense 
25/09/2015   123    Activate 
26/09/2015   123    Activate 
27/09/2015   123    Activate 
28/09/2015   123    Activate 
29/09/2015   123    Activate 
30/09/2015   123    Activate 
26/09/2015   123    Activate 
27/09/2015   ABC    NEW 
28/09/2015   ABC    NEW 
29/09/2015   ABC    NEW 
30/09/2015   ABC    NEW 
01/09/2015   ABC    NEW 
02/09/2015   ABC    NEW 

Моих желаний привести

Date of Transaction Customer_ID Customer_Register_Status 
25/09/2015   123    Activate 
27/09/2015   ABC    NEW 

правил являются результатами

  • Использования клиента Register_status должен показать последний статус
  • Дата должна быть первой датой изменение последнего статуса
  • В случае Customer_Register_Status никогда не изменить отображение должно отображаться первой датой сделки

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

+0

** Подсказка: ** 'ROW_NUMBER()' 'разделены customer_register_status', упорядочены по дате по убыванию. –

+0

Результат вашего примера неверен –

+0

Это очень разумный вопрос, который плохо описан. Кажется, что ФП хочет получить первую дату появления самого последнего статуса. –

ответ

0

Вы хотите первую дату последнего статуса. , , то есть дата перехода на последний статус.

Вот один метод, который выполняет следующие действия:

  • Создает флаг при изменении статуса.
  • Имеет ли прямую сумму флага для создания grp для идентификации соседних строк с тем же статусом.
  • Рассчитывает максимальную дату для каждого клиента.
  • Составляет ли агрегация по клиенту и grp, сохраняя только группу, в которой максимальная дата совпадает с максимальной датой клиента.

SQL, является:

select t.customer_id, min(dte), status 
from (select dte, customer_id, status, 
      sum(case when prev_status = status then 0 else 1 end) over (partition by customer_id) as statusgrp, 
      max(dte) over (partition by customer_id) as maxdte 
     from (select t.*, 
        lag(status) over (partition by customer_id order by dte) as prev_status 
      from table t 
      ) t 
    ) t 
group by customer_id, statusgrp, status, maxdte 
having max(dte) = maxdte; 
Смежные вопросы