2012-07-26 17 views
5

:yakın rekor Bunu ben sorgusu kullanabilirsiniz bir tarihten önce en yakın rekoru almak için biliyorum

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

Ama böylece günler dizisi için bunu yapmak gerekir ben Her gün için en yakın kaydı biliyorum. Herhangi bir fikir?

Günün serisi generate_sequence() tarafından üretilecektir.

En yakın önceki kayıt, değer istediğimiz için önceki gün olabilir, ancak yine de iade edilmesi gerekir.

+0

Veri türleriniz nedir - 'date' veya' timestamp'? Tam olarak "en yakın" tanımlayın. Gün serilerini nasıl sağlıyorsunuz? Tablolardaki tarihler, satır başına bir tarih mi? –

+0

Tip zaman damgası vardır. "En yakın kayıt öncesi", verilen tarihten önce ilk kayıt olarak tanımlanır. Bu potansiyel olarak bir önceki günde bir kayıt içerir. – root

cevap

4

olmalı basit hızlı bir LEFT JOIN ve DISTINCT ON ile &:

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; 

Sonuç (taklit değerler):

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 

bir tablo fonksiyon ya da iç içe olmayan dizi ya da başka bir şey generate_series() oluşturulacak bir dizi olabilir değerlerini sağlamak için, CTE kullanın. (Eğer? "() Generate_sequence" tarafından generate_series() kastettiniz)

Önce JOIN erken veya eşit resulttime tablosundaki tüm satırlara arama damgaları. JOIN yerine LEFT JOIN kullanıyorum, böylece tablodaki hiçbir önceki resulttime yokken arama zaman damgaları bırakılmıyor.

ORDER BY x.search_ts, r.resulttime DESC ile birlikte DISTINCT ON (x.search_ts) ile birlikte, her arama zaman damgasına eşit veya daha küçük olan en büyük (veya eşit derecede büyük olan) resulttime'u elde ederiz.

1

Basit alt sorgu kullanarak sadece günlük bileşeni damgası takarak olur bu

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

gibi bir şey olurdu sizin örneğe benzer bir zaman serisinden bir gün sınırı içinde büyük tarihini belirlemek için date_trunc fonksiyon ve sonra max GROUP BY kullanarak her kesilmiş tarih için büyük zaman damgası toplama()

+0

Teşekkürler, ama sadece bir güne sınırlamanın, en yakın önceki sonucun farklı bir günde olduğu senaryoyu kaçıracağına inanıyorum. – root

İlgili konular