sql >> Databasteknik >  >> RDS >> Sqlserver

gör undergruppsaggregationer i sql baserat på ett kolumnvärde

Du kan tilldela en grupperingsparameter genom att räkna antalet done rekord före varje post. Resten är bara sammanställning, även om att tilldela en bokstav för varje grupp verkar vara en onödig komplikation:

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;

Den här frågan skulle vara enklare (och mer effektiv) i SQL Server 2012+, som stöder kumulativa summor.

EDIT:

Jag märker att jag använder en underfråga för detta, men det är inte nödvändigt. Detta kan skrivas som:

      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. Jag vill lagra array av objekt i MySQL i individuell kolumn med Sequelize

  2. använder enctype=multipart/form-data med arabiska språk

  3. Slår samman 3 tabeller/frågor med MS Access Union Query

  4. Hur ansluter man till SQL Server-databas från JavaScript i webbläsaren?