sql >> Database teknologi >  >> RDS >> Oracle

Oracle Analytic-funktioner - nulstilling af en vinduesklausul

Det her er lidt kompliceret. I stedet for at bruge rank() eller lignende, brug lag() at se, hvornår noget ændrer sig. Lav derefter en kumulativ sum af flaget.

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;

Her er SQLFiddle.

EDIT:

Dette er Gordon, der redigerer mit eget svar. Ups. Den oprindelige forespørgsel var 90 % af vejen dertil. Det identificerede grupperne hvor tallene skulle stige, men tildelte ikke tallene inden for grupperne. Jeg ville gøre dette med et andet niveau af row_number() som i:

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;

Så den overordnede idé er følgende. Brug først lag() for at bestemme, hvor en gruppe begynder (det vil sige, hvor der er et afdelingsskifte fra den ene dato til den næste). Tildel derefter et "gruppe-id" til disse ved at lave en kumulativ sum. Det er de optegnelser, der skal opregnes. Det sidste trin er at opregne dem ved hjælp af row_number() .



  1. Sådan undgår du MySQL 'Deadlock fundet, når du forsøger at få lås; prøv at genstarte transaktion'

  2. Hvordan pg_sleep_for() virker i PostgreSQL

  3. PostgreSQL høj tilgængelighed med Master-Slave &Master-Master-arkitekturer

  4. Forskellen mellem SET autocommit=1 og START TRANSACTION i mysql (Er jeg gået glip af noget?)