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

Функции на Oracle Analytic - нулиране на клауза за прозорец

Това е малко сложно. Вместо да използвате rank() или други подобни, използвайте lag() да видим кога нещо се промени. След това направете кумулативна сума на флага.

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;

Ето SQLFiddle.

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

Това е Гордън, който редактира моя собствен отговор. Опа! Първоначалната заявка беше 90% от пътя до там. Той идентифицира групите където числата трябва да се увеличат, но не са присвоили номерата в рамките на групите. Бих направил това с друго ниво на row_number() както в:

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;

И така, общата идея е следната. Първо използвайте lag() за да се определи къде започва група (тоест къде има смяна на отдел от една дата на друга). След това задайте „идентификатор на групата“ за тях, като направите кумулативна сума. Това са записите, които трябва да бъдат изброени. Последната стъпка е да ги изброите с помощта на 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. Условно дефинирайте курсор

  2. Получаване на изключение ORA-00942:таблица или изглед не съществува - при вмъкване в съществуваща таблица

  3. Съхранена процедура в Java срещу съхранена процедура в PL/SQL

  4. Как да поръчате по дата в PostgreSQL или Oracle

  5. Как да променя формата на датата от ММ/ДД/ГГГГ на ГГГГ-ММ-ДД в PL/SQL?