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

fazendo agregações de subgrupos MÚLTIPLOS


Eu acho que basicamente a mesma ideia se aplica à pergunta anterior. Você quer contar o número de registros feitos estritamente antes de qualquer registro feito. Isso fornece um identificador de grupo que pode ser usado para agregação.

No SQL Server 2012+, você usaria a funcionalidade de soma cumulativa. Em versões anteriores, você pode fazer a mesma coisa com uma subconsulta correlacionada ou aplicação externa.

Esta versão modifica o seu acima de várias maneiras. Em particular, simplifica a lógica de definir grp . Não vejo facilmente como row_number() se encaixa na consulta. Eu entendo a lógica - enumere as ações feitas e use isso para agregação. Mas, obter esse valor em todas as linhas do grupo não é 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;