sql >> Databasteknik >  >> RDS >> Oracle

Oracle Analytic-funktioner - återställning av en fönsterklausul

Det här är lite komplicerat. Istället för att använda rank() eller liknande, använd lag() för att se när något förändras. Gör sedan en kumulativ summa av flaggan.

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;

Här är SQLFiddle.

EDIT:

Det här är Gordon som redigerar mitt eget svar. Hoppsan. Den ursprungliga frågan var 90 % av vägen dit. Den identifierade grupperna där siffrorna skulle öka, men tilldelade inte siffrorna inom grupperna. Jag skulle göra detta med en annan nivå av 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 övergripande idén är följande. Använd först lag() för att avgöra var en grupp börjar (det vill säga var det sker ett avdelningsbyte från ett datum till ett annat). Tilldela sedan ett "grupp-id" till dessa, genom att göra en kumulativ summa. Det är dessa poster som ska räknas upp. Det sista steget är att räkna upp dem med row_number() .



  1. Asynkron replikering automatisk failover i MySQL 8.0.22

  2. Vad är DATALENGTH() i SQL Server?

  3. Kumulativ summa i MS SQL-server

  4. Kan en Android-app ansluta direkt till en online mysql-databas