Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erstellen von Untergruppenaggregationen in SQL basierend auf einem Spaltenwert

Sie können einen Gruppierungsparameter zuweisen, indem Sie die Anzahl der done zählen Datensätze vor jedem Datensatz. Der Rest ist nur Aggregation, obwohl die Zuweisung eines Buchstabens für jede Gruppe wie eine unnötige Komplikation erscheint:

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;

Diese Abfrage wäre einfacher (und effizienter) in SQL Server 2012+, das kumulative Summen unterstützt.

BEARBEITEN:

Ich merke, dass ich dafür eine Unterabfrage verwende, aber das ist nicht notwendig. Dies kann geschrieben werden als:

      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