Postgres поддържа прозоречни функции които отговарят на тази ситуация:
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
За всяка комбинация от date
, symbol
, тази заявка връща value
и created_time
от реда с най-висок (т.е. последен ) created_time
от тази date
и symbol
.
Бих предложил този индекс:
CREATE UNIQUE INDEX test_table_idx
ON test_table (date, symbol, created_time, value)
Това е покритие индекс (има всички стойности, от които се нуждаете за заявката, премахвайки необходимостта от достъп до действителната таблица и която вече сте имали), но имайте предвид, че created_time
идва преди value
, така че данните вече са в своя ред на дялове и value
е най-маловажният атрибут, тъй като не участва в никакво определяне на това кой ред да се върне.