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

Skondensowane okresy czasu za pomocą SQL

Rozwiązanie z książki „Microsoft® SQL Server® 2012 High-Performance T-SQL using Window Functions”

;with C1 as(
select GroupID, FromDate as ts, +1 as type, 1 as sub
  from dbo.table_name
union all
select GroupID, dateadd(day, +1, ToDate) as ts, -1 as type, 0 as sub
  from dbo.table_name),
C2 as(
select C1.*
     , sum(type) over(partition by GroupID order by ts, type desc
                      rows between unbounded preceding and current row) - sub as cnt
  from C1),
C3 as(
select GroupID, ts, floor((row_number() over(partition by GroupID order by ts) - 1) / 2 + 1) as grpnum
  from C2
  where cnt = 0)

select GroupID, min(ts) as FromDate, dateadd(day, -1, max(ts)) as ToDate
  from C3
  group by GroupID, grpnum;

Utwórz tabelę:

if object_id('table_name') is not null
  drop table table_name
create table table_name(GroupID varchar(100), FromDate datetime,ToDate datetime)
insert into table_name
select 'A', '01/01/2012', '12/31/2012' union all
select 'A', '12/01/2013', '11/30/2014' union all
select 'A', '01/01/2015', '12/31/2015' union all
select 'A', '01/01/2015', '12/31/2015' union all
select 'A', '02/01/2015', '03/31/2015' union all
select 'A', '01/01/2013', '12/31/2013'


  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 używać tego samego harmonogramu dla wielu zadań agenta programu SQL Server (T-SQL)

  2. Nagłówki kolumn T-SQL Pivot/Unpivot(Transpose) potrzebne jako wiersze danych

  3. Excel do SQL Server z Microsoft.ACE.OLEDB.12.0

  4. Coldfusion:Radzenie sobie z wartościami Null w polu daty

  5. Czy aktualizacja wyzwala zdarzenie INSERT, ponieważ wszystkie aktualizacje są DELETE + (re)INSERT w SQL Server?