A cláusula SQL OVER () – quando e por que é útil?

Então, em palavras simples: A cláusula over pode ser usada para selecionar valores não agregados junto com os agregados.

Partition BY, ORDER BY dentro e ROWS ou RANGE são parte da cláusula OVER () by.

partição por é usado para particionar dados e, em seguida, executar essas janelas, funções agregadas e, se não o fizermos ter partição por todo o conjunto de resultados é considerado como uma única partição.

Vejamos a sintaxe básica da cláusula OVER

PARTITION BY: é usado para particionar dados e executar operações em grupos com os mesmos dados.

ORDER BY: é usado para definir a ordem lógica dos dados nas partições. Quando não especificamos a partição, todo o conjunto de resultados é considerado como uma única partição

: Isso pode ser usado para especificar quais linhas devem ser consideradas em uma partição ao executar a operação.

Vejamos um exemplo:

Aqui está meu conjunto de dados:

Então, deixe-me executar diferentes cenários e ver como os dados são afetados e irei de uma sintaxe difícil para uma simples um

Basta observar a parte sum_sal. Aqui, estou usando ordenar por Salário e usar “RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW”. Neste caso, não estamos usando partição, então todos os dados serão tratados como um partição e estamos ordenando o salário. E o importante aqui é ANTERIOR DESAPARECIDO E LINHA ATUAL. Isso significa que quando estamos calculando a soma, da linha inicial até a linha atual de cada linha. Mas se virmos linhas com salário 5000 e nome = “Pavan”, idealmente deveria ser 17.000 e para salario = 5.000 e nome = Marcos, deveria ser 22.000. Mas como estamos usando RANGE e neste caso, se encontrar algum s elementos semelhantes, então, ele os considera como o mesmo grupo lógico e executa uma operação sobre eles e atribui valor a cada item nesse grupo. Por isso temos o mesmo valor para salário = 5000. O motor subiu para salário = 5000 e Nome = Ron e soma calculada e, em seguida, atribuída a todos os salários = 5000.

Assim, com LINHAS ENTRE DESBASTE ANTERIOR E LINHA ATUAL A diferença é para itens de mesmo valor em vez de agrupando-os, calcula SUM da linha inicial para a linha atual e não trata itens com o mesmo valor de forma diferente como RANGE

Esses resultados são iguais aos de

Isso ocorre porque Over (ordenar por salário) é apenas um atalho de Over (ordenar por intervalo de salário ENTRE DESBLOQUEADO ANTES E LINHA ATUAL) Então, onde quer que simplesmente especificamos Ordenar por sem LINHAS ou RANGE, ele está aceitando RANGE BETWEEN UNBOUNDED PRECEDING E CURRENT ROW como padrão.

Observação: Isso se aplica apenas a funções que realmente aceitam RANGE / ROW. Por exemplo, ROW_NUMBER e alguns outros não aceitam RANGE / ROW e, nesse caso , isso não entra em cena.

Até agora vimos que a cláusula Over com um pedido de está assumindo Range / ROWS e a sintaxe parece algo hing assim RANGE ENTRE UNBOUNDED PRECEDING E CURRENT ROWAnd está realmente calculando até a linha atual a partir da primeira linha. Mas e se ele quiser calcular valores para toda a partição de dados e tê-los para cada coluna (ou seja, da primeira linha à última linha). Aqui está a consulta para isso

Em vez de CURRENT ROW, estou especificando UNBOUNDED FOLLOWING, que instrui o mecanismo a calcular até o último registro de partição para cada linha.

Agora, chegando ao seu apontar o que é OVER () com colchetes vazios?

É apenas um atalho para Over (ordenar por salário LINHAS ENTRE ANTES DE ANTERIOR E SEGUINTE ANTES)

Aqui estamos especificando indiretamente para tratar todo o meu conjunto de resultados como uma única partição e, em seguida, realizar cálculos do primeiro ao último registro de cada partição.

Eu criei um vídeo sobre isso e se você estiver interessado, pode visitá-lo. https://www.youtube.com/watch?v=CvVenuVUqto&t=1177s

Obrigado, Pavan Kumar AryasomayajuluHTTP: //xyzcoder.github.io

Write a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *