В Oracle 12.1 или выше, MATCH_RECOGNIZE
может быстро выполнить такие требования. Я создаю пример данных в предложении WITH
(не является частью оператора SQL - используйте ваши фактические имена таблиц и столбцов). Я изменил имена столбцов - в именах столбцов не должно быть пробелов (ваш первый столбец есть), и они не должны быть ключевыми словами Oracle (например, DAY или DATE). Я не заказывал выход в любом случае; если это окончательный отчет, который не используется при дальнейшей обработке, вы можете добавить в конце предложение ORDER BY.
with
sample_data(customer, dt, fruit) as (
select 'Tony' , date '2018-11-01', 'Orange' from dual union all
select 'Tony' , date '2018-11-02', 'Apple' from dual union all
select 'Tony' , date '2018-11-03', 'Pear' from dual union all
select 'Tony' , date '2018-11-04', 'Plum' from dual union all
select 'Tony' , date '2018-11-05', 'Grape' from dual union all
select 'David', date '2018-11-03', 'Orange' from dual union all
select 'David', date '2018-11-04', 'Watermelon' from dual union all
select 'David', date '2018-11-05', 'Cantelope' from dual union all
select 'Bern' , date '2018-11-05', 'Kiwi' from dual union all
select 'Aaron', date '2018-11-01', 'Orange' from dual union all
select 'Aaron', date '2018-11-02', 'Apple' from dual union all
select 'Aaron', date '2018-11-03', 'Watermelon' from dual union all
select 'Aaron', date '2018-11-04', 'Kiwi' from dual union all
select 'Aaron', date '2018-11-05', 'Pear' from dual
)
select *
from sample_data
match_recognize (
partition by customer
order by dt desc
all rows per match
pattern ( ^ a{3} )
define a as null is null
)
;
выход
CUSTOMER DT FRUIT
-------- ---------- -------------
Aaron 2018-11-05 Pear
Aaron 2018-11-04 Kiwi
Aaron 2018-11-03 Watermelon
David 2018-11-05 Cantelope
David 2018-11-04 Watermelon
David 2018-11-03 Orange
Tony 2018-11-05 Grape
Tony 2018-11-04 Plum
Tony 2018-11-03 Pear