Postgres unterstützt Fensterfunktionen die zu dieser Situation passen:
select date, symbol, value, created_time
from (select *,
rank() over (partition by date, symbol order by created_time desc) as rownum
from test_table) x
where rownum = 1
Für jede Kombination von date
, symbol
, gibt diese Abfrage den value
zurück und created_time
aus der Reihe mit der höchsten (also letzten). ) created_time
dieses date
und symbol
.
Ich würde diesen Index vorschlagen:
CREATE UNIQUE INDEX test_table_idx
ON test_table (date, symbol, created_time, value)
Es ist eine Hülle index (verfügt über alle Werte, die Sie für die Abfrage benötigen, sodass Sie nicht auf die eigentliche Tabelle zugreifen müssen und die Sie bereits hatten), aber beachten Sie, dass created_time
kommt vor value
, also befinden sich die Daten bereits in ihrer Partitionsreihenfolge und value
ist das am wenigsten wichtige Attribut, da es nicht an der Bestimmung beteiligt ist, welche Zeile zurückgegeben werden soll.