2016-09-10 3 views
3

Die Herausforderung besteht darin, mithilfe von SQL überlappende Gebote anhand von Datum und Uhrzeit zu erkennen und anzugeben, mit welchen Geboten sie sich überschneidet.Erkennen überlappender Datums-/Uhrzeiteinträge und Anzeigen der Überschneidungen mit SQL

Betrachten Sie die Tabelle und Datensätze:

------------------------------------------------------------------- 
| person_id | bid_id | start_at   | end_at    | 
------------------------------------------------------------------- 
| 1   | 10  | 2016-10-30 09:00 AM | 2016-10-30 11:00 AM | 
| 1   | 20  | 2016-10-30 10:00 AM | 2016-10-30 12:00 PM | 
| 1   | 30  | 2016-10-30 05:00 PM | 2016-10-30 06:00 PM | 
| 1   | 40  | 2016-10-30 11:45 AM | 2016-10-30 02:00 PM | 
| 2   | 50  | 2016-10-30 07:00 PM | 2016-10-30 08:00 PM | 
| 2   | 60  | 2016-10-30 07:00 PM | 2016-10-30 08:00 PM | 
| 2   | 70  | 2016-10-30 09:00 PM | 2016-10-30 10:00 PM | 
------------------------------------------------------------------- 

gewünschte Ausgabe:

-------------------------------------------- 
| person_id | bid_id | overlapping_bid_ids | 
-------------------------------------------- 
| 1   | 10  | { 20 }    | 
| 1   | 20  | { 10, 40 }   | 
| 1   | 40  | { 20 }    | 
| 2   | 50  | { 60 }    | 
| 2   | 60  | { 50 }    | 
-------------------------------------------- 

Antwort

2

Sie array_agg() verwenden und eine Join:

select b.person_id, b.bid_id, array_agg(b2.bid_id) 
from bids b join 
    bids b2 
    on b2.person_id = b.person_id and 
     b2.end_at > b.start_at and 
     b2.start_at < b.end_at and 
     b2.bid_id <> b.bid_id 
group by b.person_id, b.bid_id; 

Beachten Sie die Logik für zwei Zeiträume überlappende . Sie überlappen sich, wenn der erste vor dem zweiten beginnt und der erste nach dem ersten Start. Dies ist Teilüberschneidungen sowie vollständige Überlappungen. Sie können auch die Implementierung des ANSI-Standardbereichsoperators overlap von Postgres verwenden, wenn Sie dies bevorzugen.

+0

Nitpicking: Der "Überlappungs" -Operator ist nicht Postgres-spezifisch und gehört zum SQL-Standard. –

+0

Vielen Dank! –

Verwandte Themen