問題は、一連の重複する時間がある可能性があるためです。レコード 1 はレコード 2 とオーバーラップし、レコード 2 はレコード 3 とオーバーラップします。これは、CTE やその他の種類のループなどを使わずに解決するのは困難です。とにかく試してみてください。
CTE クエリの最初の部分は、新しいグループを開始するサービスを取得し、他のサービスと開始時間が同じではありません (グループを開始するレコードが 1 つだけ必要です)。 2 番目の部分は、グループを開始するものを取得しますが、同じ開始時刻を持つものは複数あります。繰り返しますが、そのうちの 1 つだけが必要です。最後の部分は、重複するすべてのサービスを取得して、開始グループに再帰的に構築されます。
SQLFiddle はこちら さまざまな種類の重複時間と重複時間を示すために、さらにレコードが追加されています。
ServiceID
を使用できませんでした BeginTime
と同じように並べる必要があるためです。 .
; with flat as( 存在しないサービス S1 からの groupid として StaffID、ServiceDate、BeginTime、EndTime、BeginTime を選択します (S1.StaffID =S2.StaffID および S1.ServiceDate =S2 であるサービス S2 から * を選択します。 ServiceDate および S2.BeginTime <=S1.BeginTime および S2.EndTime <> S1.EndTime および S2.EndTime> S1.BeginTime) ユニオンはすべて、存在するサービス S1 からグループ ID として StaffID、ServiceDate、BeginTime、EndTime、BeginTime を選択します (select * S1.StaffID =S2.StaffID および S1.ServiceDate =S2.ServiceDate および S2.BeginTime =S1.BeginTime および S2.EndTime> S1.EndTime であるサービス S2 からであり、存在しません (S1.StaffID =であるサービス S2 から * を選択します)。 S2.StaffID と S1.ServiceDate =S2.ServiceDate と S2.BeginTime S1.BeginTime) をすべて結合し、S.StaffID、S.ServiceDate、S.BeginTime、S.EndTime、flat.groupid を選択します。 flat.StaffID =S.StaffID および flat.ServiceDate =S.ServiceDate および flat.EndTime> S.BeginTime および flat.BeginTime