sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL, aangepast aggregaat

U zei in opmerkingen dat één code twee rijen met dezelfde datum kan hebben. Dit zijn dus verstandige gegevens.

01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

Er is geen deterministische manier om te bepalen welke van die rijen de "laatste" is, zelfs niet als u sorteert op code en "datum". (In het relationele model - een model gebaseerd op wiskundige verzamelingen - is de volgorde van de kolommen niet relevant en de volgorde van de rijen niet relevant.) De query-optimizer is vrij om rijen te retourneren op de manier die het beste denkt, dus deze query

select *
from temp1
order by mydate, code

zou dit in één keer kunnen retourneren,

01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

en dit op een ander.

01.01.2014  1   3.50
01.01.2014  1  99.34
01.01.2014  1  17.25

Tenzij u een waarde opslaat die de betekenis van laatste . maakt duidelijk, wat je probeert te doen is niet mogelijk. Wanneer mensen laatste moeten maken voor de hand liggend, gebruiken ze meestal een tijdstempel.

Na uw wijzigingen lijkt deze zoekopdracht te geven wat u zoekt.

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;



  1. Hoe voeg ik meerdere records in één databasereis in met behulp van PDO?

  2. Oplossingen voor het zonder fouten lezen van het SQL Server-transactielogboekbestand

  3. MySQL:fout bij het verwijderen van de database (errno 13; errno 17; errno 39)

  4. Java + SSH + Postgres