sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL, vlastní agregát

V komentářích jste uvedl, že jeden kód může mít dva řádky se stejným datem. Takže toto jsou rozumná data.

01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

Neexistuje žádný deterministický způsob, jak zjistit, který z těchto řádků je „poslední“, i když třídíte podle kódu a „data“. (V relačním modelu – modelu založeném na matematických množinách – je pořadí sloupců irelevantní a pořadí řádků je irelevantní.) Optimalizátor dotazů může vracet řádky tak, jak považuje za nejlepší, takže tento dotaz

select *
from temp1
order by mydate, code

může to vrátit při jednom spuštění,

01.01.2014  1   3.50
01.01.2014  1  17.25
01.01.2014  1  99.34

a toto na jiném.

01.01.2014  1   3.50
01.01.2014  1  99.34
01.01.2014  1  17.25

Pokud neuložíte nějakou hodnotu, která znamená poslední je jasné, že to, o co se snažíš, není možné. Když lidé potřebují udělat poslední je zřejmé, že obvykle používají časové razítko.

Po provedených změnách se zdá, že tento dotaz vrací to, co hledáte.

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. Jak vytvořit novou databázi po prvotní instalaci databáze Oracle 11g Express Edition?

  2. MySQL SUM Hodnoty json seskupené podle klíčů json

  3. Uložit pole mysql php

  4. Jak rozdělit výsledky vyhledávání podle kategorií? MySQL + PHP