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

Loại bỏ và giảm các phạm vi ngày trùng lặp

Đối với SQL Server 2005+

-- sample table with data
declare @t table(UserID int, StartDate datetime, EndDate datetime)
insert @t select
1, '20110101', '20110102' union all select
1, '20110101', '20110110' union all select
1, '20110108', '20110215' union all select
1, '20110220', '20110310' union all select
2, '20110101', '20110120' union all select
2, '20110115', '20110125'

-- your query starts below

select UserID, Min(NewStartDate) StartDate, MAX(enddate) EndDate
from
(
    select *,
        NewStartDate = t.startdate+v.number,
        NewStartDateGroup =
            dateadd(d,
                    1- DENSE_RANK() over (partition by UserID order by t.startdate+v.number),
                    t.startdate+v.number)
    from @t t
    inner join master..spt_values v
      on v.type='P' and v.number <= DATEDIFF(d, startdate, EndDate)
) X
group by UserID, NewStartDateGroup
order by UserID, StartDate

Ghi chú:

  1. Thay thế @t với tên bảng của bạn



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tránh trùng lặp trong truy vấn CHÈN VÀO CHỌN trong SQL Server

  2. Xác định các bước cho con trỏ máy chủ SQL - Hướng dẫn sử dụng SQL Server / TSQL

  3. Tìm các ngày Thứ Hai giữa 2 ngày

  4. Kiểm tra xem một hàng có tồn tại hay không, nếu không, hãy chèn

  5. Vi phạm ràng buộc UNIQUE KEY trên INSERT WHERE COUNT (*) =0 trên SQL Server 2005