GROUP BY intervalo de marca de tiempo 10 minutos PostgreSQL [cerrado]

10

Necesito agrupar por un período de tiempo que se divide en 10 minutos.

Tengo esta consulta a continuación que me devuelve un conjunto de resultados:

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

Mi conjunto de resultados es así:

"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"

Tengo todas las marcas de tiempo entre un período, pero necesito agruparlo cada 10 minutos y no tengo idea de cómo. Intenté date_trunclo que no tiene la precisión que necesito.

Ej: entre 2013-04-07 15:30:00, 2013-04-07 15:40:00 5 results.

¿Cómo puedo hacer esto?


Intenté esto y no funcionó como se esperaba.

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

Este es el conjunto de resultados no agrupado:

"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

No funcionó.

Marco Amaral
fuente

Respuestas:

13

Puede usar esto para PostgreSQL. 600 es 10 minutos en segundos. La idea es convertir la marca de tiempo en época, dividir por intervalo deseado en minutos y luego redondear para obtener el intervalo deseado

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
Néstor Martínez
fuente
2

puedes usar esta respuesta reemplazando 300 por 600 (la cantidad de segundos en 10 minutos)

geogeek
fuente
2

Hay algunas funciones prácticas de fecha y hora . Primero, deconstruya las marcas de tiempo con date_trunccada hora, luego haga una división entera con los minutos date_partpara hacer un intervalo, que se recombina.

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;
Mike T
fuente
Esto funciona bien con todas las condiciones, debe haber sido votado. Pero no estoy seguro de por qué || ' minutes'se ha utilizado en date_part.
Vishal Shetty
integer || 'minutes'se usa para crear un tipo de intervalo, por ejemplo, "8 minutos", que se agrega a la marca de tiempo.
Mike T
1

Hice algo similar en mySql al agrupar por marca de tiempo MOD(timestamp, 600), cuyo valor de retorno será el mismo para todas las marcas de tiempo dentro de un intervalo de 10 minutos (600 segundos).

Johan Kuylenstierna
fuente