获得行值之间差异的平均值和标准差

时间:2013-11-29 22:23:45

标签: sql postgresql

鉴于下表:

CREATE TABLE datapoints
(
  id serial NOT NULL,
  datasource text,
  "timestamp" integer,
  value text,
  CONSTRAINT datapoints_pkey PRIMARY KEY (id)
)

如何计算timestamp1差异从一行到下一行的平均值和标准差?

我的意思是,如果数据如下所示:

timestamp
---------
1385565639
1385565641
1385565643

我想计算以下数据的平均值和标准差:

timestamp difference
--------------------
0
2
2

这在单个查询中是否可行?

2 个答案:

答案 0 :(得分:2)

第一个返回差异,第二个返回stdev和average:

--difference
WITH rn as(
    SELECT timestamp , row_number()over() rown
    FROM datapoints order by timestamp
)
SELECT  ta.rown, tb.rown,tb.timestamp - ta.timestamp 
FROM rn as ta,rn as tb
WHERE ta.rown=tb.rown+1 ;

--avg, stddev
WITH rn as(
    SELECT timestamp , row_number()over() rown
    FROM datapoints 
    ORDER BY timestamp
)
SELECT  stddev(tb.timestamp - ta.timestamp), avg(tb.timestamp - ta.timestamp) 
FROM rn as ta,rn as tb
WHERE ta.rown=tb.rown+1 ; 

答案 1 :(得分:1)

除非我误解或过度简化了您的问题 这样的事情可能会有所帮助。

select t2.timestamp - t1.timestamp
from
TableName t1
join TableName t2 on 
(
    t1.timestamp < t2.timestamp
    and
    (
    not exists select null from TableName tMid
    where
    tMid.timestamp > t1.timestamp and tMid.timestamp < t2.timestamp
    )
)

我怀疑这是最有效的方法,但你提到你希望用一个查询完成它。

只是给你一个主意。

如果您的ID是连续的,您可以更简单地进行连接 (在t1.ID = t2.ID-1或类似的东西上)。

然后您还需要了解如何包含最后/第一个差异 (也许你尝试外连接)。我认为我的查询错过了那个。


没关系,似乎我可能误解了你的问题。

这似乎对你的情况有用。

SQL: Show average and min/max within standard deviations