Alguém pode explicar o que a partition by
palavra - chave faz e dar um exemplo simples dela em ação, bem como por que alguém iria querer usá-la? Eu tenho uma consulta SQL escrita por outra pessoa e estou tentando descobrir o que ela faz.
Um exemplo de partição por:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
Os exemplos que eu vi online parecem um pouco detalhados demais.
sql
oracle
window-functions
Alex Beardsley
fonte
fonte
Respostas:
o
PARTITION BY
cláusula define o intervalo de registros que serão usados para cada "GRUPO" dentro daOVER
cláusula.No seu exemplo de SQL,
DEPT_COUNT
retornará o número de funcionários desse departamento para cada registro de funcionário. (É como se você estivesse desmalizando aemp
tabela; você ainda retorna todos os registros noemp
tabela.)Se houvesse outra coluna (por exemplo,
state
), você poderia contar quantos departamentos nesse estado.É como obter os resultados de um
GROUP BY
(SUM
,AVG
, etc.) sem a agregar o conjunto de resultados (ou seja, remover registros correspondentes).É útil quando você usa as funções
LAST OVER
ouMIN OVER
para obter, por exemplo, o salário mais alto e mais baixo no departamento e, em seguida, usá-lo em um cálculo com relação ao salário registrado sem uma sub-seleção, o que é muito mais rápido.Leia o artigo vinculado da AskTom para obter mais detalhes.
fonte
last over
emin over
. Eu imagino que uma sub-seleção seria mais lenta, mas a gramática inglesa na resposta não sugere isso.O conceito é muito bem explicado pela resposta aceita, mas acho que quanto mais exemplo se vê, melhor ele se encaixa. Aqui está um exemplo incremental:
1) O chefe diz "obtenha-me o número de itens que temos em estoque, agrupados por marca"
Você diz : "não há problema"
Resultado:
2) O chefe diz "Agora, consiga uma lista de todos os itens, com a marca E o número de itens que a respectiva marca possui"
Você pode tentar:
Mas você obtém:
É aqui que
OVER (PARTITION BY BRAND)
entra:O que significa:
COUNT(ITEM_ID)
- obtenha o número de itensOVER
- Sobre o conjunto de linhas(PARTITION BY BRAND)
- que tenham a mesma marcaE o resultado é:
etc ...
fonte
É a extensão SQL chamada analytics. O "over" na instrução select informa ao oracle que a função é uma função analítica, não um grupo por função. A vantagem de usar a análise é que você pode coletar somas, contagens e muito mais com apenas uma passagem dos dados em vez de fazer um loop pelos dados com sub-seleções ou pior, PL / SQL.
Parece confuso no começo, mas isso será uma segunda natureza rapidamente. Ninguém explica melhor do que Tom Kyte. Portanto, o link acima é ótimo.
Obviamente, ler a documentação é uma obrigação.
fonte
Aqui estamos obtendo a contagem para o respectivo departamento. Quanto ao departamento 10, temos 4 registros na tabela com resultados semelhantes para o departamento 20 e 30 também.
fonte
a palavra-chave over partition é como se estivéssemos particionando os dados criando client_id, um subconjunto de cada ID de cliente
esta consulta retornará o número de operações realizadas pelo client_id
fonte
Penso que este exemplo sugere uma pequena nuance sobre como o particionamento funciona e como agrupar por trabalhos. Meu exemplo é do Oracle 12, se for um erro de compilação.
Eu tentei :
No entanto, isso funciona como esperado:
Produzindo o número de elementos em cada estado com base na chave externa "data_key". Portanto, se data_key = 'APPLE' tivesse 3 linhas com o estado 'A', 2 linhas com o estado 'B', uma linha com o estado 'C', a linha correspondente para 'APPLE' seria 'APPLE', 3, 2 , 1, 6.
fonte