鉴于下表:
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
这在单个查询中是否可行?
答案 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或类似的东西上)。
然后您还需要了解如何包含最后/第一个差异 (也许你尝试外连接)。我认为我的查询错过了那个。
没关系,似乎我可能误解了你的问题。
这似乎对你的情况有用。