5

ある日付より前に最も近いレコードを取得するには、次のクエリを使用できることを知っています。

select * 
from results 
where resulttime = (select max(resulttime) 
                    from results 
                    where some_id = 15 
                      and resulttime < '2012-07-27');

しかし、これを一連の日に行う必要があるため、毎日の最も近い記録を知ることができます。何か案は?

一連の日数は によって生成されgenerate_sequence()ます。

最も近い前のレコードは、値が必要なものの前日である可能性がありますが、それでも返される必要があります。

4

2 に答える 2

4

とで最も単純で最速である必要が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、テーブル内の以前または等しいすべての行のタイムスタンプを検索しますresulttimeLEFT JOIN代わりにを使用して、テーブルにJOIN事前情報がまったくない場合に検索タイムスタンプが削除されないようにします。resulttime

DISTINCT ON (x.search_ts)組み合わせて、各検索タイムスタンプ以下ORDER BY x.search_ts, r.resulttime DESCの最大値(または同等に最大値の1つ)を取得します。resulttime

于 2012-07-26T19:03:01.190 に答える
1

あなたの例に似た時系列から1日の境界内で最大の日付を識別する単純なサブクエリは、次のようになります

SELECT max(resulttime), date_trunc('days',resulttime) FROM results GROUP BY 2;

これは、 date_trunc関数を使用してタイムスタンプを日付コンポーネントのみに固定し、GROUP BY max() を使用して、切り捨てられた日付ごとに最大のタイムスタンプを収集します。

于 2012-07-26T09:34:06.910 に答える