PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL, benutzerdefiniertes Aggregat

Sie haben in Kommentaren gesagt, dass ein Code zwei Zeilen mit demselben Datum haben kann. Das sind also vernünftige Daten.

01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

Es gibt keine deterministische Möglichkeit zu sagen, welche dieser Zeilen die "letzte" ist, selbst wenn Sie nach Code und "Datum" sortieren. (Im relationalen Modell – einem Modell, das auf mathematischen Sätzen basiert – ist die Reihenfolge der Spalten irrelevant und die Reihenfolge der Zeilen irrelevant.) Dem Abfrageoptimierer steht es frei, Zeilen so zurückzugeben, wie er es für am besten hält, also diese Abfrage

select *
from temp1
order by mydate, code

könnte dies bei einem Durchlauf zurückgeben,

01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

und dies auf einem anderen.

01.01.2014  1   3.50
01.01.2014  1  99.34
01.01.2014  1  17.25

Es sei denn, Sie speichern einen Wert, der die Bedeutung von last ausmacht offensichtlich, was Sie zu tun versuchen, ist nicht möglich. Wenn Menschen überdauern müssen Offensichtlich verwenden sie normalerweise einen Zeitstempel.

Nach Ihren Änderungen scheint diese Abfrage das zurückzugeben, wonach Sie suchen.

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;