0

サンプリング頻度が 2 分のテンポラル データベースがあり、1 日の瞬時値を 00:00、01:00、02、... 23 として抽出したいと考えています。
だから、私は値の平均から平均値を取得したいと思います:

HH-1:58、HH:00、および HH:02 = HH 時の平均

また

HH-1:59、HH:01、および HH:03 = HH 時の平均

サンプルデータ1:

9/28/2007 23:51 -1.68
9/28/2007 23:53 -1.76
9/28/2007 23:55 -1.96
9/28/2007 23:57 -2.02
9/28/2007 23:59 -1.92
9/29/2007 0:01  -1.64
9/29/2007 0:03  -1.76
9/29/2007 0:05  -1.83
9/29/2007 0:07  -1.86
9/29/2007 0:09  -1.94

期待される結果:

午前 0 時の場合:

(-1.92+-1.64+-1.76)/3

サンプルデータ2:

9/28/2007 23:54 -1.44
9/28/2007 23:56 -1.58
9/28/2007 23:58 -2.01
9/29/2007 0:00  -1.52
9/29/2007 0:02  -1.48
9/29/2007 0:04  -1.46

予想された結果:

(-2.01+-1.52+-1.48)/3

4

2 に答える 2

2
SELECT  hr, ts, aval
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY hr ORDER BY ts) rn
        FROM    (
                SELECT  *,
                        DATE_TRUNC('hour', ts) AS hr,
                        AVG(value) OVER (ORDER BY ts ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS aval
                FROM    mytable
                ) q
        ) q
WHERE   rn = 1
于 2013-01-17T17:17:53.843 に答える
1

PostgreSQL のウィンドウ関数により、隣接する行が関係するものはすべて、以前よりもはるかに単純になります。試していませんが、おおよそ正しいはずです:

select
  date_trunc('hour', newest_time) as average_time,
  (oldest_temp + middle_temp + newest_temp) / 3 as average_temp
from (
  select
    date_trunc('hour', sample_time) as average_time,
    lag(sample_time, 2) over w as oldest_time,
    lag(sample_time, 1) over w as middle_time,
    sample_time as newest_time,
    lag(sample_temp, 2) over w as oldest_temp,
    lag(sample_temp, 1) over w as middle_temp,
    sample_temp as newest_temp
  from
    samples
  window
    w as (order by sample_time)
) as s
where
  oldest_time = newest_time - '4 minutes'::interval and
  middle_time = newest_time - '2 minutes'::interval and
  extract(minute from newest_time) in (2, 3);

私はwhere句でこれをあなたが説明したシナリオに正確に制限しました - :02 または :03 の最新の値、2 分前と 4 分前の 2 つの値。欠落しているデータがある場合に備えて、それ以外の場合は、はるかに長い間隔で平均化するなど、奇妙な結果が得られます。

于 2013-01-17T16:11:06.460 に答える