sql >> Databasteknik >  >> RDS >> Oracle

Gruppering av data i olika tabeller baserat på minimidatum för en händelse

Med hjälp av en MIN som analytisk funktion kan du beräkna frukten som bör övervägas för en kund.

Eftersom ordningen inte är alfabetisk måste du hjälpa till med en DECODE

Vila är en enkel grupp med en MIN för inköpsdatumet, men med tanke på endast inköpen med MIN-frukten.

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 är en alternativ lösning utan att använda analytiska funktioner .

Den första underfrågan beräknar minimal frukt med en silpme group by använder samma DECODE logik.

Du måste ansluta underfrågan till den ursprungliga tabellen som är exakt vad du kan spara med hjälp av analytiska funktioner.

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;

Med dina exempeldata returnerar detta

   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. Hur löser man detta i Mysql (#1242 - Subquery returnerar mer än 1 rad)?

  2. mysql:hitta rader med upprepade värden plus villkor

  3. Få exekveringstid för PostgreSQL-fråga

  4. Hur justerar man SET-intervallstilen (ändrar intervallutgången) i PostgreSQL?