Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

tworzenie agregacji podgrup w sql na podstawie wartości kolumny

Możesz przypisać parametr grupowania, licząc liczbę done rekordy przed każdym rekordem. Reszta to tylko agregacja, chociaż przypisanie litery do każdej grupy wydaje się niepotrzebną komplikacją:

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;

To zapytanie byłoby prostsze (i wydajniejsze) w SQL Server 2012+, który obsługuje sumy skumulowane.

EDYCJA:

Zauważyłem, że używam do tego podzapytania, ale nie jest to konieczne. Można to zapisać 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sqlcmd:Błąd:Microsoft SQL Server Native Client 10.0:Błąd łącza komunikacyjnego

  2. Szyfrowanie tabel bazy danych w SQL Server 2008

  3. SQL Server:Awaria łącza komunikacyjnego Wymagany SSL (nie udało się odebrać pakietu)

  4. Jak naprawić:JSON_VALUE zwraca NULL z długimi ciągami (SQL Server)

  5. Co to jest funkcja wartościująca tabelę w programie SQL Server?