1

DB テーブルに次のデータがあり、開始時間と終了時間に基づいて同時トランザクションを見つけたいと考えています。

Patient          Start Time        End Time
John             08:31A            10:49A 
Jim              10:14A            10:30A
Jerry            10:15A            10:28A
Alice            10:18A            12:29P
Bobby            10:32A            10:49A
Sally            10:46A            10:55A
Jane             10:52A            11:29A
Jules            10:54A            11:40A
Adam             10:58A            11:25A
Ben              11:00A            11:20A
Ann              11:31A            11:56A
Chris            11:49A            11:57A
Nick             12:00P            12:21P
Dave             12:00P            12:35P
Steve            12:23P            12:29P

特定の入力と重複する時間を見つけたい場合、どのように記述すればよいでしょうか? たとえば、10:58A-11:25A 時間との重複を見つけたいとします。これは、潜在的な同時並行性を見つける必要があります。同時オーバーラップの最大数を探しています。10:58A-11:25A の例では、次のように表示します (カウントは 5 になります)。

Patient          Start Time        End Time
Alice            10:18A            12:29P
Jane             10:52A            11:29A
Jules            10:54A            11:40A
Adam             10:58A            11:25A
Ben              11:00A            11:20A

2 番目の例では、同時実行時間の一部が探している時間と重複していますが、別の範囲が始まる前に終了しています。たとえば、10:46A ~ 10:55A を探しているとします。この例では、08:31A-10:49A は 10:52A-11:29A が開始する前に終了しているため、ドロップされます。10:32A~10:49Aも同様で、10:52A~11:29A開始前に終了。したがって、10:46A ~ 10:55A の範囲で最も同時発生するのは 4 ですが、全体では 6 (2 がドロップ) です。

Patient          Start Time        End Time
Alice            10:18A            12:29P
Sally            10:46A            10:55A
Jane             10:52A            11:29A
Jules            10:54A            11:40A

これはSQLステートメントで行うことができますか?

4

1 に答える 1

1

最も簡単でクリーンな方法は、行を除外することです。

以下を除くすべての行:

  • 開始時間前に終了する行数
  • 終了時刻より後に開始する行

サンプル:

select * from your table t
where
   not ( 
     t.end < begin_time 
     or
     t.start > end_time 
   )

sqlfiddle のサンプル

于 2012-10-22T16:34:40.843 に答える