2012-10-04 3 views
2

my_values을 데이터베이스에있는 것보다 시간 축에서 더 낮은 해상도로 플롯하려고합니다.타임 스탬프를 임의의 간격으로 자릅니다.

SELECT DATE_TRUNC('hour', my_timestamps) AS my_time_lowres 
    , AVG(my_values) 
FROM my_table 
GROUP BY my_time_lowres 
어느 정도의 타임 스탬프의 해상도를 감소시키는 것이 가능 date_trunc()를 사용

(따라 : 나는 시간 간격 (예를 들어, 시간) 당 평균 값을 얻기 위해 다음과 같은 SQL과 같은 것을 사용) the docs에 :

... 
second 
minute 
hour 
day 
week 
... 
:

select date_trunc('hour', timestamp '2001-02-16 20:38:40') 
-- the output is: 2001-02-16 20:00:00 

이 방법, 나는 다음과 같은 간격 크기 (및 일부 큰/작은 크기)이 작업을 수행 할 수 있습니다


다른 시간 간격 (예 : 3 시간, 6 시간)에도이 방법을 사용할 수 있습니까?

답변

5

결과 15 분의 해상도와 총까지 타임 스탬프를 가져 오는이 데모를 고려 속는 :

WITH tbl(id, ts) AS (VALUES 
    (1::int, '2012-10-04 00:00:00'::timestamp) 
    ,(2, '2012-10-04 18:23:01') 
    ,(3, '2012-10-04 18:30:00') 
    ,(4, '2012-10-04 18:52:33') 
    ,(5, '2012-10-04 18:55:01') 
    ,(6, '2012-10-04 18:59:59') 
    ,(7, '2012-10-05 11:01:01') 
    ) 
SELECT to_timestamp((extract(epoch FROM ts)::bigint/900)*900)::timestamp 
                  AS lower_bound 
    , to_timestamp(avg(extract(epoch FROM ts)))::timestamp AS avg_ts 
    , count(*) AS ct 
FROM tbl 
GROUP BY 1 
ORDER BY 1; 

결과 :

 lower_bound  |  avg_ts  | ct 
---------------------+---------------------+---- 
2012-10-04 00:00:00 | 2012-10-04 00:00:00 | 1 
2012-10-04 18:15:00 | 2012-10-04 18:23:01 | 1 
2012-10-04 18:30:00 | 2012-10-04 18:30:00 | 1 
2012-10-04 18:45:00 | 2012-10-04 18:55:51 | 3 
2012-10-05 11:00:00 | 2012-10-05 11:01:01 | 1 

트릭은 @Michael 같은 유닉스 시대에 이미 게시를 추출하는 것입니다. 정수 부분은 소수점 이하 자릿수가 잘리지 않기 때문에 선택한 해상도의 버킷으로 함께 묶어줍니다.

15 분 = 900 초이므로 900으로 나눕니다.

같은 번호로 곱하면 lower_bound이됩니다. 유닉스 에포크를 to_timestamp()으로 타임 스탬프로 다시 변환하십시오.

이것은 소수점 이하 자릿수로 표시 할 수있는 간격에 효과적입니다. 훨씬 더 다재다능하기 때문에이 recent, closely related answer에서 보여 주듯이 종종 간과 된 기능 width_bucket()을 사용하십시오. 더 많은 설명, 링크 및 sqlfiddle 데모가 있습니다.

0

당신은 시대 이후의 초 수를 변환 * 3600 3에 의해 정수 나누기에 갈 수 있습니다, * 3600 (6) 등

관련 문제