sql >> データベース >  >> RDS >> Sqlserver

SQL で期間を要約する

    ブック「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;
    

    テーブルを作成:

    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. MySQLレプリケーションのベストプラクティス

    2. SQL Server 2008:アンマネージ ライブラリをロードする CLR ストアド プロシージャはどのようにクラッシュセーフなのか

    3. sp_executesql クエリを実行すると、パラメーター @statement が必要になります

    4. asp.net のデータベースに挿入された大きな画像サイズを更新できません