5

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

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

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

这一系列天将由 生成generate_sequence()

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

4

2 回答 2

4

LEFT JOIN使用and应该是最简单和最快的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-26T19:03:01.190 回答
1

从类似于您的示例的时间序列中识别一天边界内最大日期的简单子查询将是这样的

SELECT max(resulttime), date_trunc('days',resulttime) FROM results GROUP BY 2;

即使用date_trunc函数将时间戳固定到日期组件,然后使用 GROUP BY max() 收集每个截断日期的最大时间戳

于 2012-07-26T09:34:06.910 回答