กลุ่มตามช่วงเวลาประทับ 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;

ใช้งานได้ดีกับทุกเงื่อนไขต้องได้รับการ upvoted แต่ผมไม่แน่ใจว่าทำไมมีการใช้ใน|| ' minutes' date_part
Vishal Shetty

integer || 'minutes'จะใช้ในการสร้างประเภทช่วงเวลาเช่น "8 นาที" ซึ่งจะถูกเพิ่มลงในการประทับเวลา
Mike T

1

ฉันทำสิ่งที่คล้ายกันใน mySql โดยจัดกลุ่มตามการประทับเวลา - MOD(timestamp, 600)ค่าส่งคืนซึ่งจะเหมือนกันสำหรับการประทับเวลาทั้งหมดภายใน 10 นาที (600 วินาที) intevall

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.