Oracle
 sql >> Base de données >  >> RDS >> Oracle

Regroupement des données dans différentes tables en fonction de la date minimale d'un événement

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