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

列の値に基づいてSQLでサブグループ集計を作成する

    done の数を数えることで、グループ化パラメータを割り当てることができます 各レコードの前にレコード。残りは単なる集計ですが、各グループに文字を割り当てるのは不必要な複雑さのように思えます:

    select grp as record, min(Date) as DateBegin,
           max(case when Action = 'Done' then Date end) as DateEnd,
           count(*) as NumActions,
           sum(case when Action = 'Escalation' then 1 else 0 end) as NumEscalations
    from (select e.*, coalesce(e2.grp, 0) as grp
          from example e outer apply
               (select count(*) as grp
                from example e2
                where e2.id < e.id and e2.Action = 'Done'
               ) e2
         ) e
    group by grp;
    

    このクエリは、累積合計をサポートする SQL Server 2012 以降ではより単純 (かつ効率的) になります。

    編集:

    これにはサブクエリを使用していることに気付きましたが、それは必須ではありません。これは次のように記述できます:

          select coalesce(grp, 0) as record, min(Date) as DateBegin,
                 max(case when Action = 'Done' then Date end) as DateEnd,
                 count(*) as NumActions,
                 sum(case when Action = 'Escalation' then 1 else 0 end) as NumEscalations
          from example e outer apply
               (select count(*) as grp
                from example e2
                where e2.id < e.id and e2.Action = 'Done'
               ) e2
          group by e2.grp
    


    1. Sphinx 2.0.4 MAMP 2.0でのインストールエラー:MySQLヘッダーが見つかりません

    2. MySQLの列で同じ値を持つ行を検索します

    3. PHPはPythonを介してmysqlに接続できません

    4. MySQL concat()を使用して、クエリで使用する列名を作成しますか?