Powiedziałeś w komentarzach, że jeden kod może mieć dwa wiersze z tą samą datą. Więc to są rozsądne dane.
01.01.2014 1 3.50
01.01.2014 1 17.25
01.01.2014 1 99.34
Nie ma deterministycznego sposobu, aby stwierdzić, który z tych wierszy jest „ostatni”, nawet jeśli sortujesz według kodu i „daty”. (W modelu relacyjnym — modelu opartym na zbiorach matematycznych — kolejność kolumn jest nieistotna, a kolejność wierszy nie ma znaczenia). Optymalizator zapytań może zwracać wiersze w sposób, który uważa za najlepszy, więc to zapytanie
select *
from temp1
order by mydate, code
może zwrócić to za jednym razem,
01.01.2014 1 3.50
01.01.2014 1 17.25
01.01.2014 1 99.34
a to na innym.
01.01.2014 1 3.50
01.01.2014 1 99.34
01.01.2014 1 17.25
Chyba że przechowujesz jakąś wartość, która czyni znaczenie ostatnim oczywiste, że to, co próbujesz zrobić, nie jest możliwe. Kiedy ludzie muszą zrobić ostatni oczywiste, zwykle używają znacznika czasu.
Po wprowadzeniu zmian to zapytanie wydaje się zwracać to, czego szukasz.
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;