Oracle
 sql >> Database >  >> RDS >> Oracle

Raggruppamento di dati in diverse tabelle in base alla data minima di un evento

Utilizzando un MIN come funzione analitica è possibile calcolare il frutto che dovrebbe essere considerato per un cliente.

Poiché l'ordine non è alfabetico, devi aiutare con un DECODE

Rest è un semplice raggruppamento con un MIN per la data di acquisto, ma considerando solo gli acquisti con frutta 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

Bellow è una soluzione alternativa senza utilizzare funzioni analitiche .

La prima sottoquery calcola il frutto minimo con un silpme group by utilizzando lo stesso DECODE log.

Devi unire la sottoquery alla tabella originale che è esattamente ciò che puoi salvare usando le funzioni analitiche.

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;

Con i tuoi dati campione questo ritorna

   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