sql >> Databáze >  >> RDS >> Sqlserver

vytváření MULTIPLE podskupin agregací

Myslím, že v zásadě platí stejná myšlenka jako v předchozí otázce. Chcete spočítat počet provedených záznamů přísně před jakýmkoli daným provedeným záznamem. Získáte tím identifikátor skupiny, který lze poté použít pro agregaci.

V SQL Server 2012+ byste použili funkci kumulativního součtu. V dřívějších verzích můžete udělat totéž s korelovaným poddotazem nebo vnější aplikací.

Tato verze upravuje vaše výše několika způsoby. Zejména zjednodušuje logiku definování grp . Není snadné pochopit, jak row_number() zapadá do dotazu. Chápu logiku - vyjmenujte provedené akce a použijte je pro agregaci. Ale získat tuto hodnotu na všech řádcích ve skupině není triviální.

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;



  1. Jak uložit více možností vybraných uživatelem do tabulky

  2. Řešení úniku prostředků GDI

  3. PgAdmin4 povolit ladění

  4. Je možné, aby poddotaz vrátil dvě hodnoty?