Postgres mendukung fungsi jendela yang sesuai dengan situasi ini:
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
Untuk setiap kombinasi date , symbol , kueri ini mengembalikan value dan created_time dari baris dengan yang tertinggi (yaitu terakhir ) created_time dari date itu dan symbol .
Saya akan menyarankan indeks ini:
CREATE UNIQUE INDEX test_table_idx
ON test_table (date, symbol, created_time, value)
Ini adalah penutup index (memiliki semua nilai yang Anda perlukan untuk kueri, meniadakan kebutuhan untuk mengakses tabel yang sebenarnya, dan yang sudah Anda miliki), tetapi perhatikan bahwa created_time datang sebelum value , jadi data sudah dalam urutan partisinya, dan value adalah atribut yang paling tidak penting, karena tidak berpartisipasi dalam penentuan baris mana yang akan dikembalikan.