ฉันมีสถานการณ์ที่ฉันคิดว่าสามารถแก้ไขได้โดยใช้ฟังก์ชั่นหน้าต่าง แต่ฉันไม่แน่ใจ
ลองนึกภาพตารางต่อไปนี้
CREATE TABLE tmp
( date timestamp,
id_type integer
) ;
INSERT INTO tmp
( date, id_type )
VALUES
( '2017-01-10 07:19:21.0', 3 ),
( '2017-01-10 07:19:22.0', 3 ),
( '2017-01-10 07:19:23.1', 3 ),
( '2017-01-10 07:19:24.1', 3 ),
( '2017-01-10 07:19:25.0', 3 ),
( '2017-01-10 07:19:26.0', 5 ),
( '2017-01-10 07:19:27.1', 3 ),
( '2017-01-10 07:19:28.0', 5 ),
( '2017-01-10 07:19:29.0', 5 ),
( '2017-01-10 07:19:30.1', 3 ),
( '2017-01-10 07:19:31.0', 5 ),
( '2017-01-10 07:19:32.0', 3 ),
( '2017-01-10 07:19:33.1', 5 ),
( '2017-01-10 07:19:35.0', 5 ),
( '2017-01-10 07:19:36.1', 5 ),
( '2017-01-10 07:19:37.1', 5 )
;
ฉันต้องการมีกลุ่มใหม่ในแต่ละการเปลี่ยนแปลงในคอลัมน์ id_type กลุ่มที่ 1 EG จาก 7:19:21 ถึง 7:19:25, การเริ่มต้นครั้งที่ 2 และสิ้นสุดที่ 7:19:26 เป็นต้นไป
หลังจากทำงานแล้วฉันต้องการรวมเกณฑ์เพิ่มเติมเพื่อกำหนดกลุ่ม
ในขณะนี้ใช้การค้นหาด้านล่าง ...
SELECT distinct
min(min(date)) over w as begin,
max(max(date)) over w as end,
id_type
from tmp
GROUP BY id_type
WINDOW w as (PARTITION BY id_type)
order by begin;
ฉันได้รับผลลัพธ์ต่อไปนี้:
begin end id_type
2017-01-10 07:19:21.0 2017-01-10 07:19:32.0 3
2017-01-10 07:19:26.0 2017-01-10 07:19:37.1 5
ในขณะที่ฉันต้องการ:
begin end id_type
2017-01-10 07:19:21.0 2017-01-10 07:19:25.0 3
2017-01-10 07:19:26.0 2017-01-10 07:19:26.0 5
2017-01-10 07:19:27.1 2017-01-10 07:19:27.1 3
2017-01-10 07:19:28.0 2017-01-10 07:19:29.0 5
2017-01-10 07:19:30.1 2017-01-10 07:19:30.1 3
2017-01-10 07:19:31.0 2017-01-10 07:19:31.0 5
2017-01-10 07:19:32.0 2017-01-10 07:19:32.0 3
2017-01-10 07:19:33.1 2017-01-10 07:19:37.1 5
หลังจากที่ฉันแก้ไขขั้นตอนแรกฉันจะเพิ่มคอลัมน์เพิ่มเติมเพื่อใช้เป็นกฎในการแบ่งกลุ่มและอื่น ๆ เหล่านี้จะเป็นโมฆะ
รุ่น Postgres: 8.4 (เรามี Postgres ด้วย Postgis ดังนั้นจึงไม่ง่ายที่จะอัพเกรด Postgis ฟังก์ชั่นเปลี่ยนชื่อและมีปัญหาอื่น ๆ แต่หวังว่าเราจะเขียนทุกอย่างแล้วและเวอร์ชั่นใหม่จะใช้เวอร์ชั่นใหม่ 9.X ด้วย postgis 2.x)