PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL, Aggregato personalizzato

Hai detto nei commenti che un codice può avere due righe con la stessa data. Quindi questi sono dati sani.

01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

Non esiste un modo deterministico per dire quale di queste righe è "l'ultima", anche se si ordina per codice e "data". (Nel modello relazionale, un modello basato su insiemi matematici, l'ordine delle colonne è irrilevante e l'ordine delle righe è irrilevante.) Query Optimizer è libero di restituire le righe nel modo che ritiene migliore, quindi questa query

select *
from temp1
order by mydate, code

potrebbe restituire questo in una volta,

01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

e questo su un altro.

01.01.2014  1   3.50
01.01.2014  1  99.34
01.01.2014  1  17.25

A meno che non memorizzi un valore che renda il significato di ultimo ovvio, quello che stai cercando di fare non è possibile. Quando le persone hanno bisogno di ultime ovvio, di solito usano un timestamp.

Dopo le modifiche, questa query sembra restituire ciò che stai cercando.

with distinct_codes as (
  select distinct code 
  from temp1
),
corrected_table as (
select 
  case when mydate <> '' then TO_TIMESTAMP(mydate, 'DD.MM.YYYY HH24:MI:SS')
       else null
  end as mydate, 
  code, 
  price
from temp1
),
max_dates as (
  select code, max(mydate) max_date
  from corrected_table
  group by code
)
select c1.mydate, d1.code, coalesce(c1.price, 0)
from corrected_table c1
inner join max_dates m1
        on m1.code = c1.code
       and m1.max_date = c1.mydate
right join distinct_codes d1
        on d1.code = c1.code
order by code;