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

tworzenie WIELOKROTNYCH agregacji podgrup

Myślę, że w zasadzie obowiązuje ten sam pomysł, co w poprzednim pytaniu. Chcesz policzyć liczbę wykonanych rekordów ściśle przed jakimkolwiek danym rekordem wykonanym. Daje to identyfikator grupy, który można następnie wykorzystać do agregacji.

W SQL Server 2012+ użyjesz funkcji sumy zbiorczej. We wcześniejszych wersjach możesz zrobić to samo ze skorelowanym podzapytaniem lub zastosowaniem zewnętrznym.

Ta wersja modyfikuje powyższe na kilka sposobów. W szczególności upraszcza logikę definiowania grp . Nie widzę łatwo, jak row_number() pasuje do zapytania. Rozumiem logikę — wylicz wykonane działania i użyj ich do agregacji. Ale uzyskanie tej wartości we wszystkich wierszach w grupie nie jest trywialne.

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. przekonwertuj numer seryjny daty Excel na zwykłą datę

  2. SQL Server:ranga typu danych w operacjach arytmetycznych?

  3. Jak określić wartość pola, której nie można przekonwertować na (dziesiętne, zmiennoprzecinkowe, int) w SQL Server?

  4. Jak porównać znacznik czasu SQL w .NET?

  5. Składnia GRANT dla domeny\użytkownik