应该是最简单的&与LEFT JOIN
和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
小于或等于每个搜索时间戳。
什么是您的数据类型 - “日期”或“时间戳”?准确定义“最接近”。你如何提供这一系列的日子?作为表中的日期,每行一个日期? – 2012-07-26 13:41:05
他们是类型的时间戳。 “最近的记录优先”被定义为在给定日期之前的第一个记录。这可能包括前一天的记录。 – root 2012-07-26 17:36:00