sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL, anpassat aggregat

Du sa i kommentarerna att en kod kan ha två rader med samma datum. Så det här är vettig data.

01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

Det finns inget deterministiskt sätt att säga vilken av dessa rader som är den "sista", även om du sorterar efter kod och "datum". (I relationsmodellen - en modell baserad på matematiska mängder - är kolumnernas ordning irrelevant, och ordningen på raderna är irrelevant.) Frågeoptimeraren är fri att returnera rader på det sätt den tycker bäst, så den här frågan

select *
from temp1
order by mydate, code

kan returnera detta på en gång,

01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

och detta på en annan.

01.01.2014  1   3.50
01.01.2014  1  99.34
01.01.2014  1  17.25

Såvida du inte lagrar något värde som gör betydelsen av sista uppenbart, det du försöker göra är inte möjligt. När människor behöver göra sist uppenbart, de brukar använda en tidsstämpel.

Efter dina ändringar verkar den här frågan returnera det du letar efter.

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. Hur man arbetar med arv i Entity Framework Core

  2. ALTER-tabell - lägger till AUTOINCREMENT i MySQL

  3. Mysql:Programmatiskt ta bort alla främmande nycklar

  4. MySQL kombinerar välj med summa från annan tabell