我知道要在日期之前获取最接近的记录,可以使用查询:

select *
from results
where resulttime = (select max(resulttime)
                    from results
                    where some_id = 15
                      and resulttime < '2012-07-27');

但我需要连续几天这样做,这样我才能知道每天最接近的记录。有什么想法吗?
这一系列的天数将由generate_sequence()生成。
最近的先前记录可能在我们想要的值的前一天,但仍然需要返回。

最佳答案

应该是最简单和最快的,LEFT JOINDISTINCT 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_sequence()”generate_series()
首先,IJOIN搜索时间戳指向表中所有早于或等于resulttime的行。我使用LEFT JOIN而不是JOIN,这样当表中没有previorresulttime时,搜索时间戳就不会被删除。
结合DISTINCT ON (x.search_ts)ORDER BY x.search_ts, r.resulttime DESC我们得到最大的(或同等最大的)resulttime,它小于或等于每个搜索时间戳。

09-04 16:23