Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

създаване на агрегации на подгрупи в sql въз основа на стойност на колона

Можете да зададете параметър за групиране, като преброите броя done записи преди всеки запис. Останалото е просто агрегиране, въпреки че присвояването на буква за всяка група изглежда като ненужно усложнение:

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;

Тази заявка би била по-проста (и по-ефективна) в SQL Server 2012+, който поддържа кумулативни суми.

РЕДАКТИРАНЕ:

Забелязвам, че използвам подзаявка за това, но това не е необходимо. Това може да се запише като:

      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. Грешка на SQL Server 206:Сблъсък на тип операнд

  2. Достъпът до файловия поток на SQL Server 2008 е отказан

  3. Как програмно да създадете ODBC свързана таблица към изглед на SQL сървър и да може да бъде редактирана?

  4. Искам да покажа всички таблици, които имат указано име на колона

  5. SQL рекурсивно сортиране на менюто