Postgres hỗ trợ chức năng cửa sổ phù hợp với tình huống này:
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
Đối với mọi kết hợp của date
, ký hiệu symbol
, truy vấn này trả về giá trị symbol
và created_time
từ hàng có giá trị cao nhất (tức là cuối cùng ) created_time
của date
đó và ký hiệu symbol
.
Tôi sẽ đề xuất chỉ mục này:
CREATE UNIQUE INDEX test_table_idx
ON test_table (date, symbol, created_time, value)
Đó là một phủ chỉ mục (có tất cả các giá trị bạn cần cho truy vấn, loại bỏ nhu cầu truy cập bảng thực tế và bảng mà bạn đã có), nhưng lưu ý rằng created_time
đến trước value
, vì vậy dữ liệu đã có thứ tự phân vùng và giá trị symbol
là thuộc tính ít quan trọng nhất, vì nó không tham gia vào bất kỳ việc xác định hàng nào sẽ trả về.