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.
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? –
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