Kueri berikut menemukan titik dalam data, menurut definisi Anda. Ini menggunakan subkueri berkorelasi terlebih dahulu untuk menentukan apakah catatan adalah awal dari suatu periode (yaitu, tidak tumpang tindih dengan periode waktu sebelumnya). Ini kemudian menetapkan "periodStart" sebagai awal terbaru yang merupakan awal dari periode yang tidak tumpang tindih.
Kueri berikut (belum diuji) menggunakan pendekatan ini:
with TimeWithOverlap as (
select t.*,
(case when exists (select * from dbo.Available tbefore where t.availStart > tbefore.availStart and tbefore.availEnd >= t.availStart)
then 0
else 1
end) as IsPeriodStart
from dbo.Available t
),
TimeWithPeriodStart as (
select two.*,
(select MAX(two1.AvailStart) from TimeWithOverlap two1 where IsPeriodStart = 1 and two1.AvailStart <= two.AvailStart
) as periodStart
from TimeWithOverlap two
)
select periodStart, MAX(AvailEnd) as periodEnd
from TimeWithPeriodStart twps
group by periodStart;
http://sqlfiddle.com/#!6/3483c/20 (Permintaan Kedua)
Jika dua periode keduanya dimulai pada saat yang sama, maka itu masih berfungsi, karena nilai AvailStart sama. Karena subkueri yang berkorelasi, ini mungkin tidak bekerja dengan baik pada set data berukuran sedang sekalipun.
Ada metode lain untuk mendekati ini. Misalnya, jika Anda memiliki SQL Server 2012, Anda akan dapat menggunakan fungsi penjumlahan kumulatif, yang menawarkan metode yang lebih sederhana.