Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Funkcje Oracle Analytic — resetowanie klauzuli okienkowej

To trochę skomplikowane. Zamiast używać rank() lub podobne, użyj lag() zobaczyć, kiedy coś się zmieni. Następnie wykonaj skumulowaną sumę flagi.

select dept, date1,
       CASE WHEN StartFlag = 0 THEN 1
            ELSE 1+StartFlag+NVL(lag(StartFlag) over (order by date1),0)
       END as rnk
from (select t1.*,
             (case when dept = lag(dept) over (order by date1)
                   then 1
                   else 0
              end) as StartFlag
      from t1
     ) t1
order by date1;

Oto SQLFiddle.

EDYCJA:

Tu Gordon edytuje moją własną odpowiedź. Ups. Pierwotne zapytanie było 90% drogi tam. Zidentyfikował grupy gdzie liczby powinny wzrosnąć, ale nie przypisywać numerów w grupach. Zrobiłbym to z innym poziomem row_number() jak w:

select dept, date1,
       row_number() over (partition by dept, grp order by date1) as rnk
from (select dept, date1, startflag,
             sum(StartFlag) over (partition by dept order by date1) as grp
      from (select t1.*,
                   (case when dept = lag(dept) over (order by date1)
                         then 0
                         else 1
                    end) as StartFlag
            from t1
           ) t1
     ) t1
order by date1;

Ogólna idea jest więc następująca. Najpierw użyj lag() określić, gdzie zaczyna się grupa (to znaczy, gdzie następuje zmiana działu z jednej daty na następną). Następnie przypisz im „identyfikator grupy”, wykonując sumę skumulowaną. To są zapisy, które należy wyliczyć. Ostatnim krokiem jest ich wyliczenie za pomocą row_number() .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle sql:klauzula porządku według i odrębna

  2. Zip przy użyciu procedury składowanej Oracle

  3. Odświeżanie / aktualizowanie ekranu formularza w Oracle D2k Forms 6i

  4. Kolekcje Oracle PL/SQL — dodawanie elementów do istniejącej tabeli

  5. Funkcja NLS_UPPER() w Oracle