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

SQL Serverの連続した日付 - CTE、ループなどを使用せずに、複数の行を連続した開始日と終了日の行に要約する

    ウィンドウ関数 gaps-and-islands と呼ばれる概念の使用 .あなたの場合、連続した日付は島であり、ギャップは自明です.

    クエリが何をしているのかを明確にするために、以下の回答を冗長な方法で書きましたが、おそらくもっと簡潔な別の方法で書くことができます.各ステップ (サブクエリ) が何をするかを説明する回答の私のコメントを参照してください。

    --Determine Final output
    select min(c.StartDate) as StartDate
    , max(c.EndDate) as EndDate
    from (
        --Assign a number to each group of Contiguous Records
        select b.ID
        , b.StartDate
        , b.EndDate
        , b.EndDatePrev
        , b.IslandBegin
        , sum(b.IslandBegin) over (order by b.ID asc) as IslandNbr
        from (
            --Determine if its Contiguous (IslandBegin = 1, means its not Contiguous with previous record)
            select a.ID
            , a.StartDate
            , a.EndDate
            , a.EndDatePrev
            , case when a.EndDatePrev is NULL then 1
                   when datediff(d, a.EndDatePrev, a.StartDate) > 1 then 1
                   else 0
              end as IslandBegin
            from (
                --Determine Prev End Date
                select tt.ID
                , tt.StartDate
                , tt.EndDate
                , lag(tt.EndDate, 1, NULL) over (order by tt.ID asc) as EndDatePrev
                from dbo.Table_Name as tt
                ) as a
            ) as b
        ) as c
    group by c.IslandNbr
    order by c.IslandNbr
    


    1. テキストボックスのテキストを整数に変換する

    2. 2つの日付の間に利用可能な部屋を選択する

    3. 奇妙な文字がWebページに表示されないようにする方法

    4. Mysql-ゼロから開始するように自動インクリメントを設定する方法