NHÓM THEO khoảng thời gian 10 phút PostgreSQL [đã đóng]


10

Tôi cần nhóm theo một khoảng thời gian chia ra 10 phút.

Tôi có truy vấn này bên dưới trả về cho tôi một tập kết quả:

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

Tập kết quả của tôi là như thế này:

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

Tôi có tất cả các dấu thời gian trong khoảng thời gian, nhưng tôi cần nhóm lại sau mỗi 10 phút và tôi không biết làm thế nào. Tôi đã thử date_truncmà không có độ chính xác tôi cần.

ví dụ: giữa 2013-04-07 15:30:00, 2013-04-07 15:40:00 5 results.

Tôi có thể làm cái này như thế nào?


Tôi đã thử điều này và nó đã không hoạt động như mong đợi.

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

Đây là tập kết quả không được nhóm:

"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

Nó không hoạt động.

Câu trả lời:


12

Bạn có thể sử dụng điều này cho PostgreSQL. 600 là 10 phút trong vài giây. Ý tưởng là chuyển đổi dấu thời gian thành epoch, chia cho khoảng thời gian mong muốn trong vài phút sau đó làm tròn để có được khoảng thời gian mong muốn

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

bạn có thể sử dụng câu trả lời này bằng cách thay thế 300 bằng 600 (số giây trong 10 phút)


2

Có một vài hàm datetime tiện dụng . Đầu tiên, giải mã các dấu thời gian theo date_trunctừng giờ, sau đó thực hiện một số phép chia số nguyên với số phút date_partđể tạo một khoảng thời gian, được kết hợp lại.

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;

Điều này hoạt động tốt với tất cả các điều kiện, phải được nâng cấp. Nhưng tôi không chắc tại sao || ' minutes'đã được sử dụng trong date_part.
Vishal Shetty

integer || 'minutes'được sử dụng để tạo một loại khoảng thời gian, ví dụ "8 phút", được thêm vào dấu thời gian.
Mike T

1

Tôi đã làm một cái gì đó tương tự trong mySql bằng cách nhóm theo dấu thời gian - MOD(timestamp, 600), giá trị trả về của nó sẽ giống nhau cho tất cả các dấu thời gian trong vòng 10 phút (600 giây).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.