sql >> Databáze >  >> RDS >> Sqlserver

Odstraňte a omezte překrývající se období

Pro 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

Poznámky:

  1. Nahraďte @t s názvem vaší tabulky



  1. Hromadná/dávková aktualizace/upsert v PostgreSQL

  2. Uložená procedura volání SQL pro každý řádek bez použití kurzoru

  3. OPRAVA:MySQL – příkaz SELECT odepřen uživateli

  4. Převod datového typu datetime2 na datový typ datetime má za následek hodnotu mimo rozsah