Qualquer diferença entre a “linha atual” e “0 anterior / seguinte” na cláusula de janelas de funções analíticas do Oracle?

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

  •  22-08-2019
  •  | 
  •  

Pergunta

Algumas das funções analíticas da Oracle permitem uma windowing cláusula para especificar um subconjunto da partição atual, usando palavras-chave como "sem limites anteriores / seguinte", "linha atual", ou "value_expr anterior / seguinte", onde value_expr é um físico ou lógico deslocamento a partir da linha atual ou valor (dependendo se você tem uma linha específica ou GAMA, respectivamente).

Aqui está um exemplo usando scott / tiger que exibe funcionários em dept 30, e uma contagem do número de empregados em seu departamento contratados antes deles (incluindo eles mesmos):

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;

... Alguém pode dar um exemplo ou documentação onde "linha atual" é diferente de "0 anterior / seguinte"? Parece apenas açúcar sintático para mim ...

Foi útil?

Solução

Realmente não importa qual você usa. Eles são duas formas diferentes de expressar a janelas, mas o otimizador irá executar a consulta da mesma maneira. O termo "linha atual" é aquele que é comum a vários bancos de dados com funções analíticas, e não apenas Oracle. É mais de uma diferença estilística, da mesma forma que algumas pessoas preferem count (*) ao longo de contagem (1).

Outras dicas

A documentação do Oracle que tenho de mão (Oracle 9.2) diz:

Se você especificou GAMA:

  • value_expr é um deslocamento lógico. Ele deve ser uma constante ou expressão que avalia um valor numérico positivo ou um literal intervalo.

Isto implica que você realmente não deveria estar usando 0, uma vez que não é um valor numérico positivo. Mas, obviamente, é possível utilizar 0 anterior / seguinte desde que você é.

É tudo sobre o que você está tentando realizar. Você pode querer usar faixa entre / linhas entre usá-lo para encontrar LAST_VALUE dentro do sub-conjunto ou comparar coisas dentro de um sub-conjunto. Mas certamente você não precisa para o exemplo que você forneceu.

    select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno, trunc(hiredate,'mm')) cnt_same_month
  from emp
 where deptno = 30
 order by deptno, hiredate
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top