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

правейки МНОЖЕСТВО агрегирания на подгрупи

Мисля, че основно същата идея е валидна като в предишния въпрос. Искате да преброите броя на направените записи стриктно преди всеки даден готов запис. Това ви дава идентификатор на група, който след това може да се използва за агрегиране.

В SQL Server 2012+ ще използвате функционалността за кумулативна сума. В по-стари версии можете да направите същото със свързана подзаявка или външно приложение.

Тази версия променя горното по няколко начина. По-специално, той опростява логиката на дефиниране на grp . Не виждам лесно как row_number() се вписва в заявката. Разбирам логиката - избройте извършените действия и използвайте това за агрегиране. Но получаването на тази стойност за всички редове в групата не е тривиално.

SELECT r.Key, a.CYCLE_BEGIN_DATE, a.CYCLE_END_DATE, a.NUM_ACTIONS_IN_CYCLE
FROM Records r LEFT OUTER JOIN
     (select a.key, a2.grp, min(Date) as CYCLE_BEGIN_DATE,
             max(case when Action = 'Done') then Date end) as CYCLE_END_DATE,
             count(*) as NUM_ACTIONS_IN_CYCLE
      from actions a outer apply
           (select count(*) as grp
            from actions a2
            where a2.key = a.key and a2.date < a.date and a2.action = 'Done'
           ) a2
     group by a.key, a2.grp
    ) a
    on r.key = a.key;



  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 CASE

  2. Една и съща SQL единица между две таблици се нуждае от номера на поръчки в 1 клетка

  3. Кога е по-добре да пишете ad hoc sql срещу съхранени процедури

  4. Повторете редовете N пъти според стойността на колоната

  5. Подготвен оператор за SQL Server Nvarchar и Java