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

Untuk klub baris untuk hari kerja

Ini agak rumit. Berikut adalah pendekatan menggunakan fungsi jendela.

Pertama, gunakan tabel tanggal untuk menghitung tanggal tanpa akhir pekan (Anda juga dapat mengambil hari libur jika mau). Kemudian, perluas periode menjadi satu hari per baris, dengan menggunakan non-equijoin.

Anda kemudian dapat menggunakan trik untuk mengidentifikasi hari berurutan. Trik ini adalah menghasilkan nomor urut untuk setiap id dan menguranginya dari nomor urut untuk tanggal. Ini adalah konstan untuk hari berurutan. Langkah terakhir hanyalah agregasi.

Kueri yang dihasilkan adalah seperti ini:

with d as (
      select d.*, row_number() over (order by date) as seqnum
      from dates d
      where day not in ('Saturday', 'Sunday')
     )
select t.id, min(t.date) as startdate, max(t.date) as enddate, sum(duration)
from (select t.*, ds.seqnum, ds.date,
             (d.seqnum - row_number() over (partition by id order by ds.date) ) as grp
      from table t join
           d ds
           on ds.date between t.startdate and t.enddate
     ) t
group by t.id, grp;

EDIT:

Berikut ini adalah versi pada ini SQL Fiddle:

with d as (
      select d.*, row_number() over (order by date) as seqnum
      from datetable d
      where day not in ('Saturday', 'Sunday')
     )
select t.id, min(t.date) as startdate, max(t.date) as enddate, sum(duration)
from (select t.*, ds.seqnum, ds.date,
             (ds.seqnum - row_number() over (partition by id order by ds.date) ) as grp
      from (select t.*, 'abc' as id from table1 t) t join
           d ds
           on ds.dateid between t.startdate and t.enddate
     ) t
group by grp;

Saya yakin ini berhasil, tetapi tabel tanggal tidak memiliki semua tanggal di dalamnya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan SQL IF diabaikan

  2. Len() vs panjang data() di SQL Server 2005

  3. SQL Server 2008 GEOGRAFI STDistance() nilai

  4. Cara Membuat Batasan Kunci Asing dengan Opsi ON DELETE SET NULL di SQL Server - Tutorial SQL Server / TSQL Bagian 81

  5. Perbedaan antara Select Unique dan Select Distinct