Continuando o assunto anterior sobre window functions, vamos falar sobre o terceiro parâmetro que utilizamos na cláusula OVER que são as opções de framing  que alteram o modo como se opera e exibe o resultado.

Neste grupo temos duas formas de delimitar o resultado da query variando de acordo com a necessidade da análise.

As formas para aplicar na consulta são, começando por ROW ou RANGE.

  • UNBOUNDED PRECEDING AND CURRENT ROW
  • CURRENT ROW AND UNBOUNDED FOLLOWING

Quando utilizamos a primeira cláusula a linha atual, se for uma operação de soma, uma linha irá sempre somar com a sua anterior, veja o exemplo:

Como a query quer gerar um valor para a nova coluna cust_subtotal, sempre que a consulta for atribuir um novo valor, irá somar com o valor atribuído da linha anterior. O valor 2507,03 soma com 2341,97 que resulta em 4849,00.

Agora, utilizando a segunda cláusula do grupo de framing deste recurso, temos uma inversão na forma como os valores são exibidos sendo o maior vindo primeiro, porém a lógica permanece a mesma. Veja abaixo:

Como dito o resultado e o mesmo, alterando apenas a ordem com que a coluna subtotal é exibida e se repararem, não há nenhuma declaração na cláusula order by para que esta mude a exibição.

LIMITANDO AS AÇÕES DE FRAMING

Como vimos, o quando utilizamos este recurso de offset ou framing dentro de uma window function delimitamos  ação que a query terá e com isso seu resultado, porém, é possível limitar ainda mais o modo como ela seleciona e calcula os valores para uma consulta.

Dependendo do valor que passamos, ela pode ignorar uma quantidade de linhas e só então, realizar o cálculo e nos retornar o valor. Veja o exemplo.

Repare nas três linhas da coluna SubTotal, para cada linha em sua respectiva coluna (prev_sbtotal e nxt_subtotal) podemos visualizar o valor anterior e o próximo respectivamente.

As linhas que retornaram NULL não possuem valor anterior ou um próximo valor, não baseado nos parâmetros que passamos na query. 

Uma outra forma de utilizar este recurso seria mesclar a forma como a query calcula o resultado somando o anterior e o próximo para obter o valor da linha atual. Veja o exemplo:

Ou seja, a linha dois nesta query somou seu valor com o valor registrado da linha 01 e 03. Um fato interessante que nesta forma, nenhuma das linhas somou com os valores da coluna sum_subtotal, como ocorreu no primeiro exemplo.

Este post é um complemento do post sobre First e Last Value em SQL ou T-SQL. Nele eu quis aprofundar um pouco mais como as cláusulas de framing funcionam e como elas influenciam o resultado das queries.

Espero que tenham curtido essa nova seção e continuem acessando para mais posts como estes.

Saúde