LEFT JOIN
使用and应该是最简单和最快的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;
结果(虚拟值):
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
我使用CTE来提供值,可以是表或函数或未嵌套的数组或由generate_series()
其他东西生成的集合。(你的意思generate_series()
是“generate_sequence()”吗?)
首先,我JOIN
搜索表中所有早于或等于的行的时间戳resulttime
。我使用LEFT JOIN
而不是JOIN
这样,当表中根本没有先验时,不会删除搜索时间戳resulttime
。
结合我们得到小于或等于每个搜索时间戳DISTINCT ON (x.search_ts)
的ORDER BY x.search_ts, r.resulttime DESC
最大(或同样最大的一个) 。resulttime