Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Gruppierung von Daten in verschiedene Tabellen basierend auf dem Mindestdatum eines Ereignisses

Mit einem MIN als Analysefunktion können Sie die Früchte berechnen, die für einen Kunden in Betracht gezogen werden sollten.

Da die Reihenfolge nicht alphabetisch ist, müssen Sie mit einem DECODE nachhelfen

Rest ist eine einfache Gruppierung mit einem MIN für das Kaufdatum, aber nur die Käufe mit der MIN-Frucht.

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 ist eine alternative Lösung ohne Verwendung von Analysefunktionen .

Die erste Unterabfrage berechnet die Minimalfrucht mit einem silpme group by mit demselben DECODE logik.

Sie müssen die Unterabfrage mit der ursprünglichen Tabelle verknüpfen, was genau das ist, was Sie mit analytischen Funktionen speichern können.

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;

Mit Ihren Beispieldaten gibt dies zurück

   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