Използвайки MIN като аналитична функция, можете да изчислите плодовете, които трябва да бъдат взети предвид за клиент.
Тъй като редът не е азбучен, трябва да помогнете с DECODE
Rest е проста група с MIN
за датата на закупуване, но като се вземат предвид само покупките с MIN плодове.
with cust as (
select CUST_ID, PURCH_DATE, FRUIT,
decode(min(decode(FRUIT,'Apple',1,'Orange',2,'Banana',3)) over (partition by cust_id),
1,'Apple',2,'Orange',3,'Banana') as min_fruit
from tab)
select CUST_ID,min_fruit,
min(case when FRUIT = MIN_FRUIT then PURCH_DATE end) min_purch_date
from cust
group by CUST_ID,min_fruit
order by 1,2
По-долу е алтернативно решение без използване на аналитични функции .
Първата подзаявка изчислява минималния плод със silpme group by
използвайки същия DECODE
логика.
Трябва да присъедините подзаявката към оригиналната таблица, която е точно това, което можете да запазите с помощта на аналитични функции.
with min_fruit as (
select CUST_ID,
decode(min(decode(FRUIT,'Apple',1,'Orange',2,'Banana',3)),
1,'Apple',2,'Orange',3,'Banana') as min_fruit
from tab
group by cust_id)
select cust.CUST_ID,min_fruit fruit,
min(case when FRUIT = MIN_FRUIT then PURCH_DATE end) min_purch_date
from tab cust
join min_fruit on cust.cust_id = min_fruit.cust_id
group by cust.CUST_ID,min_fruit
order by 1,2;
С вашите примерни данни това се връща
CUST_ID FRUIT MIN_PURCH_DATE
---------- ------ -------------------
10001 Apple 12.01.2019 00:00:00
10002 Apple 21.01.2019 00:00:00
10003 Apple 06.02.2019 00:00:00