Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Temukan Total Menit Mengabaikan Tumpang Tindih (Konversikan Jawaban berbasis Kursor ke CTE)

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sql Server 2008 - Nilai uang pembulatan FullText?

  2. Peningkatan identitas kolom SQL Server 2012 melonjak dari 6 menjadi 1000+ pada entri ke-7

  3. Versi SQL Server yang digunakan tidak mendukung tipe data datetime2?

  4. Kolom tidak ada dalam klausa IN, tetapi SQL berjalan

  5. cara membuat dan memanggil fungsi skalar di sql server 2008