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.