Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truy vấn hợp nhất các bản ghi thời gian liên tục

declare @T table
(
  id int,
  start_date datetime,
  end_date datetime
)

insert into @T values
(1,      '01/01/2011',   '01/10/2011'),
(2,      '01/11/2011',   '01/20/2011'),
(3,      '01/25/2011',   '02/01/2011'),
(4,      '02/10/2011',   '02/15/2011'),
(5,      '02/16/2011',   '02/27/2011')

select row_number() over(order by min(dt)) as new_id,
       min(dt) as start_date,
       max(dt) as end_date
from (
      select dateadd(day, N.Number, start_date) as dt,
             dateadd(day, N.Number - row_number() over(order by dateadd(day, N.Number, start_date)), start_date) as grp
      from @T
        inner join master..spt_values as N
          on N.number between 0 and datediff(day, start_date, end_date) and
             N.type = 'P'
     ) as T
group by grp
order by new_id        

Bạn có thể sử dụng bảng số thay vì sử dụng master..spt_values .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Int PK bên trong Tham gia Vs Hướng dẫn PK bên trong Tham gia bên trong SQL Server. Kế hoạch thực hiện

  2. MS SQL Server 2005 - Thủ tục được lưu trữ Tự phát ngắt

  3. Cách tạo nhật ký lỗi hoặc nhật ký lỗi tùy chỉnh trong Gói SSIS?

  4. Cài đặt từng bước SQL Server 2017 -2

  5. Chèn một chuỗi với các số 0 ở đầu để nó dài 3 ký tự trong SQL Server 2008