5

私はpostgresqlにあまり詳しくないので、これが紛らわしければすみません。「サイト」でいっぱいのテーブルを持つpostgresデータベースがあります。各サイトは約 1 時間に 1 回報告し、報告すると、次のようにこの表にエントリを作成します。

site |      tstamp
-----+--------------------
6000 | 2013-05-09 11:53:04
6444 | 2013-05-09 12:58:00
6444 | 2013-05-09 13:01:08
6000 | 2013-05-09 13:01:32
6000 | 2013-05-09 14:05:06
6444 | 2013-05-09 14:06:25
6444 | 2013-05-09 14:59:58
6000 | 2013-05-09 19:00:07

ご覧のように、タイム スタンプが目立たないことはほとんどなく、わずか数分/秒の間に 2 つ以上のタイム スタンプが現れることもあります。さらに、一部のサイトでは、一度に何時間も報告されません (場合によっては)。サイトごと、1 時間ごとに 1 つのエントリのみを選択したい (1 時間ごとにできる限り近い)。これを効率的に行うにはどうすればよいですか?また、これを他の時間枠に拡張する必要があります (サイトごとに 1 日 1 回のエントリなど、可能な限り真夜中に近い)。

あらゆる提案に感謝します。

4

3 に答える 3

5

1 時間あたりの最も近い値を探しています。時間前のものもあれば、時間後のものもあります。それはこれを難しい問題にします。

まず、特定の時間に有効な値の範囲を特定する必要があります。このため、その時間の 15 分前から 45 分後までをその時間と見なします。したがって、2:00 の考慮期間は 1:45 から 2:45 になります (任意ですが、データには妥当と思われます)。これを行うには、タイム スタンプを 15 分ずらします。

次に、時間に最も近い値を取得する必要があります。したがって、1:57 から 2:05 を優先します。これは、(57, 60 - 57, 5, 60 - 5) の最初の値を考慮することで実行できます。

以下を使用して、これらのルールを SQL ステートメントに入れることができますrow_number()

select site, tstamp, usedTimestamp
from (select site, tstamp,
             date_trunc('hour', tstamp + 'time 00:15') as usedTimestamp
             row_number() over (partition by site, to_char(tstamp + time '00:15', 'YYYY-MM-DD-HH24'),
                                order by least(extract(minute from tstamp), 60 - extract(minute from tstamp))
                               ) as seqnum
      from t
     ) as dt
where seqnum = 1;
于 2013-05-09T21:00:56.547 に答える
1

質問の拡張性の側面について。

I also will need to extend this to other time frames (like one entry per site per day

サイト ID の個別のセットから、(再帰的な) CTE を使用して、指定された StartDateTime、EndDateTime の範囲内で、サイトごとに 1 時間 (または他の指定された間隔) ごとに 1 つのエントリで構成されるセットを構築します。

          SITE..THE DATE-TIME-HOUR
          6000  12.1.2013 00:00:00
          6000  12.1.2013 01:00:00
          .
          .
          . 
          6000  12.1.2013 24:00:00              
          7000  12.1.2013 00:00:00        
          7000  12.1.2013 01:00:00
          .
          .
          . 
          7000  12.1.2013 24:00:00

次に、サイト ID の SITES ログに対してその CTE を結合し、CTE の時点と LOG の時点の最小絶対差を残します。

そうすれば、間隔ごとに各サイトの行が確保されます。

PS 長い間電話をかけていなかったサイトの場合、最新の電話入力タイムスタンプが利用可能な最も近いものとして複数回繰り返されます。

于 2013-05-09T22:21:09.967 に答える