GROUP BY 타임 스탬프 간격 10 분 PostgreSQL [닫힘]


10

10 분 간격으로 그룹화해야합니다.

결과 집합을 반환하는이 쿼리가 아래에 있습니다.

SELECT timestamp
    FROM table_1, table_2_shape_polygon
    WHERE ST_Within(earthnetworks_geometry_raios, poligono_geometry)
      AND timestamp 
      BETWEEN '2013-04-07 15:30:00' AND '2013-04-07 16:50:00'
      AND type = 0
      AND id_polygon = 2

내 결과 집합은 다음과 같습니다.

"2013-04-07 15:30:55"
"2013-04-07 15:32:52"
"2013-04-07 15:32:52"
"2013-04-07 15:34:21"
"2013-04-07 15:39:09"
"2013-04-07 16:24:25"
"2013-04-07 16:29:58"
"2013-04-07 16:33:22"
"2013-04-07 16:34:30"
"2013-04-07 16:35:09"
"2013-04-07 16:36:54"
"2013-04-07 16:38:40"
"2013-04-07 16:39:37"
"2013-04-07 16:39:37"
"2013-04-07 16:39:38"
"2013-04-07 16:39:38"
"2013-04-07 16:39:44"
"2013-04-07 16:39:56"
"2013-04-07 16:40:03"
"2013-04-07 16:40:04"
"2013-04-07 16:41:22"
"2013-04-07 16:41:27"
"2013-04-07 16:41:38"
"2013-04-07 16:41:38"
"2013-04-07 16:42:24"
"2013-04-07 16:42:39"
"2013-04-07 16:45:00"
"2013-04-07 16:45:40"
"2013-04-07 16:49:43"

나는 기간 사이에 모든 타임 스탬프가 있지만 10 분마다 그룹화해야하며 어떻게하는지 모릅니다. date_trunc필요한 정밀도가없는 것을 시도했습니다 .

예 : 사이 2013-04-07 15:30:00, 2013-04-07 15:40:00 5 results.

어떻게해야합니까?


나는 이것을 시도했지만 예상대로 작동하지 않았다.

SELECT
    timestamp 'epoch' +
    INTERVAL '1 second' * round((extract('epoch' from earthnetworks_dt_horario) / 600) * 600) as horario,
    count(earthnetworks_dt_horario)
FROM raios.earthnetworks, raios.earthnetworks_teste_poligono
WHERE ST_Within(earthnetworks_geometry_raios, poligono_geometry)
      AND earthnetworks_dt_horario 
      BETWEEN '2013-04-07 15:30:00' AND '2013-04-07 16:50:00'
      AND earthnetworks_num_tipo = 0
      AND id_poligono = 2
GROUP BY 
round(extract('epoch' from earthnetworks_dt_horario) / 600), earthnetworks_dt_horario

그룹화되지 않은 결과 집합입니다.

"2013-04-07 16:29:58";1
"2013-04-07 16:34:30";1
"2013-04-07 16:33:22";1
"2013-04-07 16:39:44";1
"2013-04-07 16:39:56";1
"2013-04-07 16:42:24";1
"2013-04-07 16:41:38";2
"2013-04-07 16:24:25";1
"2013-04-07 16:39:38";2
"2013-04-07 16:42:39";1
"2013-04-07 16:41:27";1
"2013-04-07 16:36:54";1
"2013-04-07 16:45:00";1
"2013-04-07 16:40:04";1
"2013-04-07 16:40:03";1
"2013-04-07 15:34:21";1
"2013-04-07 15:30:55";1
"2013-04-07 15:39:09";1
"2013-04-07 16:49:43";1
"2013-04-07 16:45:40";1
"2013-04-07 16:35:09";1
"2013-04-07 16:38:40";1
"2013-04-07 16:39:37";2
"2013-04-07 16:41:22";1
"2013-04-07 15:32:52";2

그것은 작동하지 않았다.

답변:


14

PostgreSQL에 사용할 수 있습니다. 600은 10 분입니다. 아이디어는 타임 스탬프를 시대로 변환하고 원하는 간격으로 분 단위로 나눈 다음 원하는 간격을 얻기 위해 반올림합니다.

SELECT COUNT(*) cnt, 
to_timestamp(floor((extract('epoch' from timestamp_column) / 600 )) * 600) 
AT TIME ZONE 'UTC' as interval_alias
FROM TABLE_NAME GROUP BY interval_alias

2

이 답변 은 300을 600으로 대체하여 사용할 수 있습니다 (10 분 후의 초 수).


2

몇 가지 편리한 날짜 / 시간 함수가 있습니다. 먼저 타임 스탬프 date_trunc를 각 시간으로 분해 한 다음 분을 사용 date_part하여 정수 나누기를 수행 하여 간격을 만듭니다.

SELECT COUNT(*), 
    date_trunc('hour', timestamp) +
    (((date_part('minute', ts)::integer / 10::integer) * 10::integer)
     || ' minutes')::interval AS ten_min_timestamp
FROM sometable_or_joins_or_whatever
GROUP BY ten_min_timestamp;

이것은 모든 조건에서 잘 작동하며 상향 조정되어야합니다. 그러나 왜 || ' minutes'에 사용 되었는지 잘 모르겠습니다 date_part.
Vishal Shetty

integer || 'minutes'시간 소인에 추가되는 간격 유형 (예 : "8 분")을 작성하는 데 사용됩니다.
Mike T

1

timestamp-로 그룹화하여 mySql에서 비슷한 작업을 수행했습니다 MOD(timestamp, 600). 반환 값은 10 분 (600 초) intevall 내의 모든 타임 스탬프에 대해 동일합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.