2016-09-10 6 views
3

ここで問題となるのは、SQLを使用して日付/時刻を使用して重複する入札を検出し、日付/時刻レコードの重複を検出し、SQLを使用して重複しているレコードを表示

テーブルやレコードを考えてみましょう:

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

所望の出力:

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; 

注重なり合う2つの期間のためのロジック:

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

答えて

2

あなたがarray_agg()と参加を使用することができます。第1の開始が第2の終了の前に開始し、第1の終了が最初の開始後に終了する場合、それらは重複します。これは部分的な重なりおよび完全な重なりを説明する。必要に応じて、PostgresのANSI標準範囲演算子overlapの実装を使用することもできます。

+0

Nitpicking: 'overlaps'演算子はPostgres固有ではなく、SQL標準の一部です。 –

+0

ありがとう! –

関連する問題