PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL, agregação personalizada


Você disse nos comentários que um código pode ter duas linhas com a mesma data. Portanto, estes são dados sensatos.
01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

Não há uma maneira determinística de saber qual dessas linhas é a "última", mesmo se você classificar por código e "data". (No modelo relacional - um modelo baseado em conjuntos matemáticos - a ordem das colunas é irrelevante e a ordem das linhas é irrelevante.) O otimizador de consulta é livre para retornar linhas da maneira que achar melhor, portanto, esta consulta
select *
from temp1
order by mydate, code

pode retornar isso em uma corrida,
01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

e isso em outro.
01.01.2014  1   3.50
01.01.2014  1  99.34
01.01.2014  1  17.25

A menos que você armazene algum valor que torne o significado de último óbvio, o que você está tentando fazer não é possível. Quando as pessoas precisam fazer último óbvio, eles geralmente usam um timestamp.

Após suas alterações, essa consulta parece retornar o que você está procurando.
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;