Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erstellen von MEHREREN Untergruppenaggregationen

Ich denke, im Grunde gilt die gleiche Idee wie in der vorherigen Frage. Sie möchten die Anzahl der erledigten Aufzeichnungen genau vor jeder gegebenen erledigten Aufzeichnung zählen. Dadurch erhalten Sie eine Gruppenkennung, die dann für die Aggregation verwendet werden kann.

In SQL Server 2012+ würden Sie die kumulative Summenfunktion verwenden. In früheren Versionen können Sie dasselbe mit einer korrelierten Unterabfrage oder einer äußeren Anwendung tun.

Diese Version modifiziert Ihr obiges in mehrfacher Hinsicht. Insbesondere vereinfacht es die Logik der Definition von grp . Ich sehe nicht leicht, wie row_number() passt in die Abfrage. Ich verstehe die Logik – zählen Sie die durchgeführten Aktionen auf und verwenden Sie diese für die Aggregation. Es ist jedoch nicht trivial, diesen Wert für alle Zeilen in der Gruppe zu erhalten.

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;