2012-07-26 188 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