วิธีจัดกลุ่มวันที่เริ่มต้นและวันที่สิ้นสุดของหลาย ๆ เรคคอร์ดในช่วงเดียวกันด้วย sql

ฉันมีคำถามที่ส่งคืนบันทึกบางส่วนให้ฉันดังนี้:

ip; start_date; end_date
0.0.0.0; 09/10/2018 00: 00: 00; 10/10/2018 01:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 01:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 02:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 03:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 05:00:00
0.0.0.0; 10/12/2018 00: 00: 00; 10/10/2018 04:00:00

อย่างที่คุณเห็น ฉันมีบันทึกบางอย่างที่หากเราจัดกลุ่มตามวันที่เริ่มต้นและวันที่สิ้นสุด ก็จะอยู่ภายในช่วงเวลาเดียวกัน

วิธีจัดกลุ่มแบบสอบถามเพื่อรับบันทึกดังนี้:

0.0.0.0; 09/10/2018 00: 00: 00; 11/10/2018 05:00:00
0.0.0.0; 10/12/2018 00: 00: 00; 10/10/2018 04:00:00

อย่างที่คุณเห็น 5 บรรทัดแรกอยู่ในช่วงเดียวกันและบรรทัดสุดท้ายไม่อยู่ในช่วงเดียวกัน


person user3308496    schedule 11.09.2019    source แหล่งที่มา
comment
ช่วงสุดท้ายดูเหมือนจะมี end_date ก่อน start_date   -  person Nick    schedule 12.09.2019
comment
คุณใช้ RDBMS ใด   -  person GMB    schedule 12.09.2019
comment
นอกจากการสังเกตของนิคแล้ว... คุณต้องการให้ช่วงเวลาสองช่วงอยู่ในกลุ่มเดียวกันภายใต้เงื่อนไขใด มันมีเส้นทางของช่วงเวลาที่ทับซ้อนกันระหว่างพวกเขาเหรอ? นี่คงจะมีกลิ่นเหมือน recursive-with-statement หรืออะไรแบบนั้นนะ ฉันคิดว่า   -  person Islingre    schedule 12.09.2019


คำตอบ (1)


คุณสามารถใช้ค่าสูงสุดสะสม () เพื่อดูว่ามีการทับซ้อนกันตรงไหน เมื่อไม่มีการทับซ้อนกัน กลุ่มก็จะเริ่มต้นขึ้น ผลรวมสะสมของจุดเริ่มต้นจะกำหนด "เกาะ" แต่ละรายการ และขั้นตอนสุดท้ายคือการรวมกลุ่ม:

select ip, grp,
       min(start_date), max(end_date)
from (select t.*,
             sum(case when prev_max_end_date >= start_date
                      then 0 else 1
                 end) over (partition by ip order by start_date) as grp
      from (select t.*,
                   max(end_date) over (partition by ip 
                                       order by start_date
                                       rows between unbounded preceding and 1 preceding
                                      ) as prev_max_end_date
            from t
           ) t
      ) t
group by ip, grp;
person Gordon Linoff    schedule 12.09.2019