我知道要在日期之前获取最接近的记录,可以使用查询:
select *
from results
where resulttime = (select max(resulttime)
from results
where some_id = 15
and resulttime < '2012-07-27');
但我需要连续几天这样做,这样我才能知道每天最接近的记录。有什么想法吗?
这一系列的天数将由
generate_sequence()
生成。最近的先前记录可能在我们想要的值的前一天,但仍然需要返回。
最佳答案
应该是最简单和最快的,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_sequence()”generate_series()
首先,I
JOIN
搜索时间戳指向表中所有早于或等于resulttime
的行。我使用LEFT JOIN
而不是JOIN
,这样当表中没有previorresulttime
时,搜索时间戳就不会被删除。结合
DISTINCT ON (x.search_ts)
和ORDER BY x.search_ts, r.resulttime DESC
我们得到最大的(或同等最大的)resulttime
,它小于或等于每个搜索时间戳。