2012-07-26 224 views
5

我知道,让之前的日期最接近的纪录,我可以使用查询:最近的记录

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

但我需要一系列的天这样做,让我知道每天最近的记录。有任何想法吗?

该系列日子将由generate_sequence()生成。

最近的在前记录可能在前一天我们想要的价值,但仍然需要返回。

+0

什么是您的数据类型 - “日期”或“时间戳”?准确定义“最接近”。你如何提供这一系列的日子?作为表中的日期,每行一个日期? – 2012-07-26 13:41:05

+0

他们是类型的时间戳。 “最近的记录优先”被定义为在给定日期之前的第一个记录。这可能包括前一天的记录。 – root 2012-07-26 17:36:00

回答

4

应该是最简单的&与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小于或等于每个搜索时间戳。

1

一个简单的子查询,以确定从类似的例子时间序列,每天边界内最大日期将是这样的

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

正在使用的钉扎的时间戳就在一天组件date_trunc功能,然后收集每个截断目前最大的时间戳,使用GROUP BY MAX()

+0

谢谢,但我认为只限于一天的时间将会错过最近的结果是在不同的日子。 – root 2012-07-26 17:38:22