Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

fazendo agregações de subgrupo em sql com base em um valor de coluna


Você pode atribuir um parâmetro de agrupamento contando o número de done registros antes de cada registro. O resto é apenas agregação, embora atribuir uma letra para cada grupo pareça uma complicação desnecessária:
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;

Essa consulta seria mais simples (e mais eficiente) no SQL Server 2012+, que dá suporte a somas cumulativas.

EDITAR:

Percebo que uso uma subconsulta para isso, mas isso não é necessário. Isso pode ser escrito como:
      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