LEFT JOIN
. के साथ सबसे सरल और तेज़ होना चाहिए और 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
जो प्रत्येक खोज टाइमस्टैम्प से छोटा या उसके बराबर होता है।