sql >> Base de Datos >  >> RDS >> Oracle

Agrupación de datos en diferentes tablas según la fecha mínima de un evento

Usando un MIN como función analítica, puede calcular la fruta que se debe considerar para un cliente.

Como el orden no es alfabético debes ayudar con un DECODE

Rest es un grupo simple con un MIN para la fecha de compra, pero considerando únicamente las compras con la fruta 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 es una solución alternativa sin usar funciones analíticas .

La primera subconsulta calcula la fruta mínima con un silpme group by usando el mismo DECODE lógica.

Debe unir la subconsulta a la tabla original, que es exactamente lo que puede guardar usando funciones analíticas.

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 sus datos de muestra, esto devuelve

   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