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
を取得します これは、各検索タイムスタンプ以下です。