Qualsiasi differenza tra “riga corrente” e “0 precedente / seguente” in windowing clausola delle funzioni analitiche Oracle?

StackOverflow https://stackoverflow.com/questions/379643

  •  22-08-2019
  •  | 
  •  

Domanda

Alcune delle funzioni analitiche di Oracle permettono di clausola di finestre per specificare un sottoinsieme della partizione corrente, utilizzando parole chiave come "illimitato precedenti / dopo", "riga corrente", o "value_expr precedente / seguente" dove value_expr è una fisica o logica offset dalla riga corrente o il valore (a seconda se si è specificato ROW o intervallo, rispettivamente).

Ecco un esempio utilizzando Scott / Tiger che visualizza i dipendenti nel reparto 30, e un conteggio del numero di dipendenti nel loro reparto assunti prima di loro (compresi se stessi):

select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno 
                          order by hiredate
                          range between unbounded preceding and current row) cnt_hired_before1,
       count(*) over (partition by deptno 
                          order by hiredate
                          range between unbounded preceding and 0 preceding) cnt_hired_before2
  from emp
 where deptno = 30
 order by deptno, hiredate;

... chiunque può fornire un esempio o la documentazione in cui "riga corrente" è diverso da "0 precedente / seguente"? Sembra proprio come zucchero sintattico per me ...

È stato utile?

Soluzione

Non ha molta importanza quale si utilizza. Sono due modi diversi di esprimere la finestre, ma l'ottimizzatore si esibiranno la query allo stesso modo. Il termine "riga corrente" è uno che è comune a più database con funzioni analitiche, non solo Oracle. E 'più di una differenza stilistica, nello stesso modo in cui alcune persone preferiscono count (*) sopra count (1).

Altri suggerimenti

La documentazione di Oracle che ho a portata di mano (Oracle 9.2) dice:

  

Se è stato specificato GAMMA:

     
      
  • value_expr è un offset di logica. Deve essere una costante o un'espressione   restituisce un valore numerico positivo   o un intervallo letterale.
  •   

Questo significa che non si dovrebbe davvero utilizzare 0 perché non è un valore numerico positivo. Ma, ovviamente, è possibile utilizzare 0 precedente / seguendo dal momento che siete.

E 'tutto su ciò che si sta cercando di realizzare. Si consiglia di utilizzare un range tra / righe tra usarlo per trovare LAST_VALUE all'interno delle cose sub-set o confrontare all'interno di un sottoinsieme. Ma certamente non è necessario per l'esempio che hai fornito.

    select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno, trunc(hiredate,'mm')) cnt_same_month
  from emp
 where deptno = 30
 order by deptno, hiredate
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top