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

平日の列をクラブにするには

    これはかなり複雑です。これは、ウィンドウ関数を使用したアプローチです。

    まず、日付テーブルを使用して、週末を含まない日付を列挙します (必要に応じて、休日を除外することもできます)。次に、非等結合を使用して、期間を行ごとに 1 日に拡張します。

    その後、トリックを使用して連続した日を識別できます。このトリックは、各 ID の連番を生成し、日付の連番から差し引くことです。これは、連日一定です。最後のステップは単なる集計です。

    結果のクエリは次のようになります:

    with d as (
          select d.*, row_number() over (order by date) as seqnum
          from dates d
          where day not in ('Saturday', 'Sunday')
         )
    select t.id, min(t.date) as startdate, max(t.date) as enddate, sum(duration)
    from (select t.*, ds.seqnum, ds.date,
                 (d.seqnum - row_number() over (partition by id order by ds.date) ) as grp
          from table t join
               d ds
               on ds.date between t.startdate and t.enddate
         ) t
    group by t.id, grp;
      

    編集:

    以下は こちら のバージョンです SQL フィドル:

    with d as (
          select d.*, row_number() over (order by date) as seqnum
          from datetable d
          where day not in ('Saturday', 'Sunday')
         )
    select t.id, min(t.date) as startdate, max(t.date) as enddate, sum(duration)
    from (select t.*, ds.seqnum, ds.date,
                 (ds.seqnum - row_number() over (partition by id order by ds.date) ) as grp
          from (select t.*, 'abc' as id from table1 t) t join
               d ds
               on ds.dateid between t.startdate and t.enddate
         ) t
    group by grp;
      

    これは機能していると思いますが、日付テーブルにすべての日付が含まれているわけではありません.




    1. MySqlvsNoSql-ソーシャルネットワークのコメントと通知のデータ構造と実装

    2. パフォーマンス複数の挿入または複数の値の単一挿入

    3. どのSqlDbTypeがvarBinary(max)にマップされますか?

    4. mySQL-テーブルロックと行ロック