Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

creazione di aggregazioni di sottogruppi in sql in base al valore di una colonna

Puoi assegnare un parametro di raggruppamento contando il numero di done record prima di ogni record. Il resto è solo aggregazione, anche se assegnare una lettera per ogni gruppo sembra una complicazione inutile:

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;

Questa query sarebbe più semplice (e più efficiente) in SQL Server 2012+, che supporta le somme cumulative.

MODIFICA:

Noto che uso una sottoquery per questo, ma non è necessario. Questo può essere scritto come:

      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