Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

fare aggregazioni di sottogruppi MULTIPLI

Penso che fondamentalmente valga la stessa idea della domanda precedente. Vuoi contare il numero di record completati rigorosamente prima di qualsiasi record fatto. Questo ti dà un identificatore di gruppo che può quindi essere utilizzato per l'aggregazione.

In SQL Server 2012+ si utilizzerà la funzionalità di somma cumulativa. Nelle versioni precedenti, puoi fare la stessa cosa con una sottoquery correlata o con un'applicazione esterna.

Questa versione modifica la tua precedente in diversi modi. In particolare, semplifica la logica di definizione di grp . Non vedo facilmente come row_number() si adatta alla query. Capisco la logica:enumera le azioni eseguite e le uso per l'aggregazione. Tuttavia, ottenere quel valore su tutte le righe del gruppo non è banale.

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;