2017-05-09 159 views
2

我目前使用這樣的:如何獲得時間戳的平均值? PostgreSQL的

select avg(tank_level) 
from (
    select row_number() over (order by id) as rn, tank_level 
    from data_tanksensor 
    where sensors_on_site_id = 91 
) s 
group by (rn + ((Select count(*)/10 From data_tanksensor where sensors_on_site_id = 91)-1))/ (Select count(*)/10 From data_tanksensor where sensors_on_site_id = 91) 
; 

要想從表10點的平均值。此表還包含時間戳,我希望獲得10個平均tank_level的平均時間戳。這被用來創建一個歷史圖。如果任何人都可以幫助我修改此查詢,以獲得平均時間戳,將不勝感激。提前致謝。

的表看起來像這樣

. id sensors_on_site_id tank_level timestamps [PK] bigint integer double precision time without time zone ........... .................. ................ ...................... 12345 91 7.5 2017-03-24 11:16:31.143362 12346 91 7.6 2017-03-24 11:21:31.148639 12347 91 5.4 2017-03-24 11:26:31.155739 12348 91 3.6 2017-03-24 11:31:31.156478 12349 91 8.5 2017-03-24 11:36:31.157303 12350 91 4.2 2017-03-24 11:41:31.172008 再舉例來說,如果我只希望這是我原來的查詢均線將

select avg(tank_level) from ( select row_number() over (order by id) as rn, tank_level from data_tanksensor where sensors_on_site_id = 91 ) s group by (rn + ((Select count(*)/2 From data_tanksensor where sensors_on_site_id = 91)-1))/ (Select count(*)/2 From data_tanksensor where sensors_on_site_id = 91) ; 粗的 查詢丟失,將平均時間戳的部分這正是我想弄明白的。但我試圖得到的預期結果是

avg timestamp double precision timestamp without time zone ................ ........................... 6.833333 2017-03-24 11:21:31... 5.433333 2017-03-24 11:36:31... 再次,這只是樣本數據,一次數百行的平均行數。謝謝

+0

請編輯您的問題,並提供樣本數據和預期的結果。 F.ex. –

+1

F.ex. 'to_timestamp(avg(摘錄(從timestamp_col開始))''? – pozs

回答

0

select to_timestamp(avg(timestamps)) "timestamps", avg(tank_level) "TankLevel" from ( select row_number() over (order by id) as rn, tank_level, extract(epoch from timestamps) "timestamps" from data_tanksensor where sensors_on_site_id = 91 ) s group by (rn + ((Select count(*)/10 From data_tanksensor where sensors_on_site_id = 91)-1))/ (Select count(*)/10 From data_tanksensor where sensors_on_site_id = 91) order by timestamps asc ; 想通了 謝謝大家的範例

1

您可以將您的時間戳轉換爲unix時間戳,將這些值相加,除以值的數量並轉換回時間戳。一個快速的工作例如:

with 
    __ts as(
     select unnest(array[ 
      '2015-11-22 09:31:00', '2015-11-22 09:32:00', '2015-11-23 11:31:00', '2015-11-23 11:32:00', 
      '2015-11-23 11:34:00', '2015-11-23 15:28:00', '2015-11-23 15:29:00', '2015-11-24 10:49:00', 
      '2015-11-24 10:50:00', '2015-11-24 11:18:00' 
     ]::timestamp without time zone[]) as ts 
    ) 
select 
    to_timestamp(sum(extract(epoch from ts))/(select count(1) from __ts)) 
from 
    __ts 
+4

Unix時間戳(aka。'double precision')可以直接進行平均('avg()'),不需要手動計算'sum()/ count()'(特別是因爲count()'可以返回零,所以相當於 - 更加繁瑣 - sum()/ nullif(count(),0)') – pozs

+0

@pozs是的,這是非常糟糕的我在那裏。接得好 – Scoots