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

haciendo MÚLTIPLES agregaciones de subgrupos

Creo que básicamente se mantiene la misma idea que en la pregunta anterior. Desea contar el número de registros realizados estrictamente antes de cualquier registro realizado. Esto le brinda un identificador de grupo que luego se puede usar para la agregación.

En SQL Server 2012+, usaría la funcionalidad de suma acumulativa. En versiones anteriores, puede hacer lo mismo con una subconsulta correlacionada o una aplicación externa.

Esta versión modifica la anterior de varias maneras. En particular, simplifica la lógica de definir grp . No veo fácilmente cómo row_number() encaja en la consulta. Entiendo la lógica:enumere las acciones realizadas y utilícelas para la agregación. Pero obtener ese valor en todas las filas del grupo no es trivial.

SELECT r.Key, a.CYCLE_BEGIN_DATE, a.CYCLE_END_DATE, a.NUM_ACTIONS_IN_CYCLE
FROM Records r LEFT OUTER JOIN
     (select a.key, a2.grp, min(Date) as CYCLE_BEGIN_DATE,
             max(case when Action = 'Done') then Date end) as CYCLE_END_DATE,
             count(*) as NUM_ACTIONS_IN_CYCLE
      from actions a outer apply
           (select count(*) as grp
            from actions a2
            where a2.key = a.key and a2.date < a.date and a2.action = 'Done'
           ) a2
     group by a.key, a2.grp
    ) a
    on r.key = a.key;