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

vytváření agregací podskupin v SQL na základě hodnoty sloupce

Parametr seskupení můžete přiřadit počítáním počtu done záznamy před každým záznamem. Zbytek je jen agregace, i když přiřazení písmene pro každou skupinu vypadá jako zbytečná komplikace:

select grp as record, min(Date) as DateBegin,
       max(case when Action = 'Done' then Date end) as DateEnd,
       count(*) as NumActions,
       sum(case when Action = 'Escalation' then 1 else 0 end) as NumEscalations
from (select e.*, coalesce(e2.grp, 0) as grp
      from example e outer apply
           (select count(*) as grp
            from example e2
            where e2.id < e.id and e2.Action = 'Done'
           ) e2
     ) e
group by grp;

Tento dotaz by byl jednodušší (a efektivnější) v SQL Server 2012+, který podporuje kumulativní součty.

EDIT:

Všiml jsem si, že k tomu používám poddotaz, ale to není nutné. To lze zapsat jako:

      select coalesce(grp, 0) as record, min(Date) as DateBegin,
             max(case when Action = 'Done' then Date end) as DateEnd,
             count(*) as NumActions,
             sum(case when Action = 'Escalation' then 1 else 0 end) as NumEscalations
      from example e outer apply
           (select count(*) as grp
            from example e2
            where e2.id < e.id and e2.Action = 'Done'
           ) e2
      group by e2.grp


  1. Jak se vyhnout této výjimce PDO:Nelze provádět dotazy, dokud jsou aktivní jiné dotazy bez vyrovnávací paměti

  2. Jak zobrazit řádky, které nejsou přítomny v jiné tabulce v MySQL

  3. Dotaz MySQL, odstraňte všechny mezery

  4. Jak kódovat (utf8mb4) v Pythonu