sql >> Databáze >  >> RDS >> Oracle

Funkce Oracle Analytic - resetování klauzule pro vytváření oken

To je trochu komplikované. Místo použití rank() nebo podobně, použijte lag() vidět, když se něco změní. Poté sečtěte kumulativní součet příznaku.

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;

Zde je SQLFiddle.

EDIT:

Toto je Gordon, který upravuje moji vlastní odpověď. Jejda. Původní dotaz byl z 90 % tam. Identifikoval skupiny kde by se měla čísla zvyšovat, ale nepřiřadil čísla v rámci skupin. Udělal bych to s jinou úrovní row_number() jako v:

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;

Celková myšlenka je tedy následující. Nejprve použijte lag() určit, kde skupina začíná (tj. kde dochází ke změně oddělení od jednoho data k dalšímu). Poté jim přiřaďte „id skupiny“ provedením kumulativního součtu. Toto jsou záznamy, které mají být vyčísleny. Posledním krokem je jejich výčet pomocí row_number() .



  1. Statické a dynamické maskování dat v FieldShield

  2. Použijte DB_ID() k vrácení ID databáze na SQL Server

  3. Jak používat funkci Substring v PostgreSQL a Redshift

  4. Zaslání protokolu SQL Serveru a obnovení po havárii Instalace a konfigurace -3