sql >> Database >  >> RDS >> Sqlserver

subgroepaggregaties maken in sql op basis van een kolomwaarde

U kunt een groeperingsparameter toewijzen door het aantal done . te tellen records voor elk record. De rest is gewoon aggregatie, hoewel het toewijzen van een letter aan elke groep een onnodige complicatie lijkt:

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;

Deze query zou eenvoudiger (en efficiënter) zijn in SQL Server 2012+, dat cumulatieve sommen ondersteunt.

BEWERKEN:

Ik merk dat ik hiervoor een subquery gebruik, maar dat is niet nodig. Dit kan worden geschreven als:

      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. DBTIMEZONE-functie in Oracle

  2. Laravel-gegevens komen niet overeen tijdens het gebruik van \PDO::ATTR_EMULATE_PREPARES => waar

  3. mysql krijgt tabelkolomnamen in alfabetische volgorde

  4. Hoe maak je een gebruiker voor een db in postgresql?