GRUPPE NACH Zeitstempelintervall 10 Minuten PostgreSQL [geschlossen]

10

Ich muss mich nach einem Zeitraum gruppieren, der sich um 10 Minuten aufteilt.

Ich habe diese Abfrage unten, die mir eine Ergebnismenge zurückgibt:

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

Meine Ergebnismenge sieht folgendermaßen aus:

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

Ich habe alle Zeitstempel zwischen einem Zeitraum, aber ich muss sie alle 10 Minuten gruppieren und ich habe keine Ahnung, wie. Ich habe versucht, date_truncwas nicht die Präzision hat, die ich brauche.

Beispiel: zwischen 2013-04-07 15:30:00, 2013-04-07 15:40:00 5 results.

Wie kann ich das machen?


Ich habe es versucht und es hat nicht wie erwartet funktioniert.

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

Dies ist die nicht gruppierte Ergebnismenge:

"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

Es hat nicht funktioniert.

Marco Amaral
quelle

Antworten:

12

Sie können dies für PostgreSQL verwenden. 600 ist 10 Minuten in Sekunden. Die Idee ist, den Zeitstempel in eine Epoche umzuwandeln, durch das gewünschte Intervall in Minuten zu teilen und dann zu runden, um das gewünschte Intervall zu erhalten

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
Nestor Martinez
quelle
2

Sie können diese Antwort verwenden, indem Sie 300 durch 600 ersetzen (die Anzahl der Sekunden in 10 Minuten).

Geogeek
quelle
2

Es gibt einige praktische Datums- / Uhrzeitfunktionen . Dekonstruieren Sie zuerst die Zeitstempel mit date_truncjeder Stunde und führen Sie dann eine ganzzahlige Division mit den Minuten durch date_part, um ein Intervall zu erstellen, das neu kombiniert wird.

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.
quelle
Dies funktioniert gut mit allen Bedingungen, muss upvoted worden sein. Aber ich bin nicht sicher, warum || ' minutes'in verwendet wurde date_part.
Vishal Shetty
integer || 'minutes'wird verwendet, um einen Intervalltyp zu erstellen, z. B. "8 Minuten", der dem Zeitstempel hinzugefügt wird.
Mike T
1

Ich habe in mySql etwas Ähnliches getan, indem ich nach Zeitstempel gruppiert habe - MOD(timestamp, 600)dessen Rückgabewert für alle Zeitstempel innerhalb eines Intervalls von 10 Minuten (600 Sekunden) gleich ist.

Johan Kuylenstierna
quelle