sql >> Base de Datos >  >> RDS >> Sqlserver

hacer agregaciones de subgrupos en sql basadas en un valor de columna

Puede asignar un parámetro de agrupación contando el número de done registros antes de cada registro. El resto es solo agregación, aunque asignar una letra para cada grupo parece una complicación innecesaria:

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;

Esta consulta sería más simple (y más eficiente) en SQL Server 2012+, que admite sumas acumulativas.

EDITAR:

Me doy cuenta de que uso una subconsulta para esto, pero eso no es necesario. Esto se puede escribir 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