5

そうです、PostgreSQLに次のようなテーブルがあります。

timestamp              duration

2013-04-03 15:44:58    4
2013-04-03 15:56:12    2
2013-04-03 16:13:17    9
2013-04-03 16:16:30    3
2013-04-03 16:29:52    1
2013-04-03 16:38:25    1
2013-04-03 16:41:37    9
2013-04-03 16:44:49    1
2013-04-03 17:01:07    9
2013-04-03 17:07:48    1
2013-04-03 17:11:00    2
2013-04-03 17:11:16    2
2013-04-03 17:15:17    1
2013-04-03 17:16:53    4
2013-04-03 17:20:37    9
2013-04-03 17:20:53    3
2013-04-03 17:25:48    3
2013-04-03 17:29:26    1
2013-04-03 17:32:38    9
2013-04-03 17:36:55    4

そして、次の出力を取得したいと思います。

タイムスタンプウィンドウ開始 = 2013-04-03 15:44:58

duration    count
1           0
2           1
3           0
4           1
9           0

タイムスタンプウィンドウ開始 = 2013-04-03 15:59:58

duration    count
1           0
2           0
3           0
4           0
9           1

タイムスタンプウィンドウ開始 = 2013-04-03 16:14:58

duration    count
1           1
2           0
3           1
4           0
9           0

タイムスタンプウィンドウ開始 = 2013-04-03 16:29:58

duration    count
1           2
2           0
3           0
4           0
9           1

等...

したがって、基本的には 15 分のウィンドウでタイムスタンプを循環し、個別の期間値とその頻度 (カウント) を出力します。timestampwindowstart 値は、ウィンドウの最も早いタイムスタンプです (つまり、timestampwindowfinish = timestampwindowstart + 15 分)。

これは、15 分間隔のヒストグラムをプロットできるようにするためです...

読んでみましたが、理解するのが少し複雑で、時間があまりありません...

助けてくれてありがとう!

4

1 に答える 1

4

手っ取り早いやり方: http://sqlfiddle.com/#!1/bd2f6/21tstamptimestamp

with t as (
  select
    generate_series(mitstamp,matstamp,'15 minutes') as int,
    duration
  from
    (select min(tstamp) mitstamp, max(tstamp) as matstamp from tmp) a,
    (select duration from tmp group by duration) b
)

select
  int as timestampwindowstart,
  t.duration,
  count(tmp.duration)
from
   t
   left join tmp on 
         (tmp.tstamp >= t.int and 
          tmp.tstamp < (t.int + interval '15 minutes') and 
          t.duration = tmp.duration)
group by
  int,
  t.duration
order by
  int,
  t.duration

簡単な説明:

  1. 最小および最大のタイムスタンプを計算する
  2. 最小値と最大値の間に 15 分の間隔を生成します
  3. 期間の一意の値を持つクロス結合の結果
  4. 元のデータを左結合します (左結合は重要です。これにより、可能なすべての組み合わせが出力に保持さnullれ、指定された間隔で期間が存在しない場所が存在するためです。
  5. データを集計します。count(null)=0

より多くのテーブルがあり、そのユニオンにアルゴリズムを適用する必要がある場合。tmp1, tmp2, tmp3すべて列tstampとを持つ 3 つのテーブルがあるとしますduration。以前のソリューションを拡張できます。

with 

tmpout as (
  select * from tmp1 union all
  select * from tmp2 union all
  select * from tmp3
)

,t as (
  select
    generate_series(mitstamp,matstamp,'15 minutes') as int,
    duration
  from
    (select min(tstamp) mitstamp, max(tstamp) as matstamp from tmpout) a,
    (select duration from tmpout group by duration) b
)

select
  int as timestampwindowstart,
  t.duration,
  count(tmp.duration)
from
   t
   left join tmpout on 
         (tmp.tstamp >= t.int and 
          tmp.tstamp < (t.int + interval '15 minutes') and 
          t.duration = tmp.duration)
group by
  int,
  t.duration
order by
  int,
  t.duration

withPostgreSQL の節を本当に知っておく必要があります。これは、PostgreSQL でのデータ分析にとって非常に重要な概念です。

于 2013-07-07T21:41:01.257 に答える