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.