Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

faire des agrégations de sous-groupes MULTIPLES

Je pense que fondamentalement la même idée tient que dans la question précédente. Vous voulez compter le nombre d'enregistrements terminés strictement avant tout enregistrement terminé donné. Cela vous donne un identifiant de groupe qui peut ensuite être utilisé pour l'agrégation.

Dans SQL Server 2012+, vous utiliseriez la fonctionnalité de somme cumulée. Dans les versions antérieures, vous pouvez faire la même chose avec une sous-requête corrélée ou une application externe.

Cette version modifie votre ci-dessus de plusieurs manières. En particulier, cela simplifie la logique de définition de grp . Je ne vois pas facilement comment row_number() correspond à la requête. Je comprends la logique - énumérez les actions effectuées et utilisez-les pour l'agrégation. Mais, obtenir cette valeur sur toutes les lignes du groupe n'est pas 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;