とで最も単純で最速である必要が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
の最大値(または同等に最大値の1つ)を取得します。resulttime