sql >> Databáze >  >> RDS >> Oracle

Seskupování dat do různých tabulek na základě minimálního data události

Pomocí MIN jako analytické funkce můžete vypočítat ovoce, které by mělo být uvažováno pro zákazníka.

Protože pořadí není abecední, musíte pomoci s DECODE

Zbytek je jednoduchá skupina s MIN pro datum nákupu, ale s ohledem pouze na nákupy s ovocem 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

Níže je alternativní řešení bez použití analytických funkcí .

První dílčí dotaz vypočítá minimální ovoce se silpme group by pomocí stejného DECODE logika.

Musíte připojit poddotaz k původní tabulce, což je přesně to, co můžete uložit pomocí analytických funkcí.

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;

S ukázkovými daty se to vrátí

   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


  1. Rozdíl mezi INSTR() vs LOCATE() v MariaDB

  2. Převeďte sekundy na dobu čitelnou pro člověka

  3. Mohu mít více databází na Oracle Express Edition

  4. Jak vyhledávací_cesta ovlivňuje rozlišení identifikátoru a aktuální schéma