sql >> データベース >  >> RDS >> PostgreSQL

一連の日付の最も近い記録

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



    1. MYSQLトリガーの構文エラー

    2. なぜPostgreSQLを学ぶ必要があるのですか?

    3. WSJDBCConnectionは、タイプOraclejdbcConnectionのオブジェクトをラップしません

    4. ケースステートメントによるグループ化