一尘不染

一系列日期的最近记录

sql

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

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

但是我需要连续几天这样做,以便我知道每天的最近记录。有任何想法吗?

这一系列的天数由生成generate_sequence()

最接近的先前记录可能在前一天,而不是我们想要的值,但仍需要返回。


阅读 145

收藏
2021-05-23

共1个答案

一尘不染

应该最简单,最快地使用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_series()是“
generate_sequence()”吗?)

首先,我JOIN搜索表中所有行的时间戳,时间戳等于或更早resulttime。我使用LEFT JOIN代替,JOIN以便当resulttime表中没有优先级时不删除搜索时间戳。

DISTINCT ON (x.search_ts)结合使用,ORDER BY x.search_ts, r.resulttime DESC我们得到的最大(或同等最大的一个)resulttime小于或等于每个搜索时间戳。

2021-05-23