En utilisant un MIN comme fonction analytique, vous pouvez calculer le fruit qui devrait être considéré pour un client.
Comme la commande n'est pas alphabétique, vous devez aider avec un DECODE
Rest est un simple group by avec un MIN
pour la date d'achat, mais en ne considérant que les achats avec le fruit 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
Ci-dessous est une solution alternative sans utiliser de fonctions analytiques .
La première sous-requête calcule le fruit minimal avec un silpme group by
en utilisant le même DECODE
logique.
Vous devez joindre la sous-requête à la table d'origine, ce qui correspond exactement à ce que vous pouvez enregistrer à l'aide des fonctions analytiques.
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;
Avec vos exemples de données, cela renvoie
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