Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wyeliminuj i zmniejsz nakładające się zakresy dat

Dla 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

Uwagi:

  1. Zastąp @t z twoją nazwą stołu



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę wymusić w strukturze encji wstawianie kolumn tożsamości?

  2. Jak używać OBJECT_ID() na obiektach między bazami danych w SQL Server

  3. Jak pogrupować według miesiąca z pola Data za pomocą sql

  4. Konwertuj liczbę całkowitą na szesnastkową i szesnastkową na liczbę całkowitą

  5. Jak zapobiec cykliczności wyzwalacza bazy danych?