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