Sẽ đơn giản và nhanh nhất với LEFT JOIN
và DISTINCT ON
:
WITH x(search_ts) AS (
VALUES
('2012-07-26 20:31:29'::timestamp) -- search timestamps
,('2012-05-14 19:38:21')
,('2012-05-13 22:24:10')
)
SELECT DISTINCT ON (x.search_ts)
x.search_ts, r.id, r.resulttime
FROM x
LEFT JOIN results r ON r.resulttime <= x.search_ts -- smaller or same
-- WHERE some_id = 15 -- some condition?
ORDER BY x.search_ts, r.resulttime DESC;
Kết quả (giá trị giả):
search_ts | id | resulttime
--------------------+--------+----------------
2012-05-13 22:24:10 | 404643 | 2012-05-13 22:24:10
2012-05-14 19:38:21 | 404643 | 2012-05-13 22:24:10
2012-07-26 20:31:29 | 219822 | 2012-07-25 19:47:44
Tôi sử dụng CTE
để cung cấp các giá trị, có thể là một bảng hoặc hàm hoặc mảng chưa được xếp hạng hoặc một tập hợp được tạo bằng generate_series()
một cái gì đó khác nữa. (Ý của bạn là generate_series()
bởi "create_sequence ()"?)
Đầu tiên tôi JOIN
dấu thời gian tìm kiếm cho tất cả các hàng trong bảng có resulttime
sớm hơn hoặc bằng . Tôi sử dụng LEFT JOIN
thay vì JOIN
để dấu thời gian tìm kiếm không bị bỏ qua khi không có resulttime
trước đó trong bảng.
Với DISTINCT ON (x.search_ts)
kết hợp với ORDER BY x.search_ts, r.resulttime DESC
chúng tôi nhận được resulttime
lớn nhất (hoặc một trong những điều lớn nhất như nhau) nhỏ hơn hoặc bằng mỗi dấu thời gian tìm kiếm.