Tipos de Funções de Janela
Vamos explorar brevemente os principais tipos de funções de janela utilizadas em SQL.
Funções de agregação
Estas são as funções de agregação padrão (AVG
, SUM
, MAX
, MIN
, COUNT
) utilizadas em um contexto de janela. Já utilizamos esse tipo de função de janela no capítulo anterior.
Funções de classificação
Funções de classificação em SQL são um tipo de função de janela que permite atribuir uma classificação a cada linha dentro de uma partição de um conjunto de resultados. Essas funções podem ser extremamente úteis para realizar cálculos e análises ordenadas.
-
RANK()
: Atribui uma classificação única para cada linha distinta dentro da partição com base na cláusulaORDER BY
. Linhas com valores iguais recebem a mesma classificação, deixando lacunas na sequência; -
DENSE_RANK()
: Semelhante ao RANK(), mas sem lacunas na sequência de classificação; -
NTILE(n)
: Divide as linhas em uma partição ordenada emn
grupos e atribui um número de grupo para cada linha.
Exemplo
Vamos classificar as vendas com base no Amount
para cada ProductID
em ordem crescente utilizando a função DENSE_RANK()
:
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
A tabela de resultados contém todas as informações da tabela principal e uma coluna adicional que fornece a classificação de cada venda para o respectivo produto.
Funções de comparação de valores
Funções de comparação de valores em janela no SQL são utilizadas para comparar valores da linha atual com valores de outras linhas dentro da mesma partição.
Essas funções são especialmente úteis para tarefas que envolvem análise de tendências, cálculos baseados em linhas adjacentes ou acesso a valores específicos de linhas dentro de uma janela definida.
Existem várias funções de comparação de valores em SQL:
LAG()
: Recupera o valor de uma linha anterior no conjunto de resultados sem a necessidade de um self-join;LEAD()
: Recupera o valor de uma linha subsequente no conjunto de resultados sem a necessidade de um self-join;FIRST_VALUE()
: Retorna o valor da primeira linha na janela;LAST_VALUE()
: Retorna o valor da última linha na janela.
Exemplo
Vamos utilizar a função de janela de comparação de valores LAG()
para calcular a variação no valor das vendas em relação à venda anterior para cada produto:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Como resultado, é possível extrair facilmente informações sobre as diferenças de vendas para cada produto específico sem utilizar subconsultas ou procedimentos armazenados.
Também é possível calcular as diferenças para todas as vendas sem particionamento utilizando a seguinte consulta:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Você pode notar que não incluímos a cláusula PARTITION BY
no bloco OVER
. Isso significa que não queremos obter os valores anteriores apenas para um produto específico, mas para todas as vendas na tabela.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 4.35
Tipos de Funções de Janela
Deslize para mostrar o menu
Vamos explorar brevemente os principais tipos de funções de janela utilizadas em SQL.
Funções de agregação
Estas são as funções de agregação padrão (AVG
, SUM
, MAX
, MIN
, COUNT
) utilizadas em um contexto de janela. Já utilizamos esse tipo de função de janela no capítulo anterior.
Funções de classificação
Funções de classificação em SQL são um tipo de função de janela que permite atribuir uma classificação a cada linha dentro de uma partição de um conjunto de resultados. Essas funções podem ser extremamente úteis para realizar cálculos e análises ordenadas.
-
RANK()
: Atribui uma classificação única para cada linha distinta dentro da partição com base na cláusulaORDER BY
. Linhas com valores iguais recebem a mesma classificação, deixando lacunas na sequência; -
DENSE_RANK()
: Semelhante ao RANK(), mas sem lacunas na sequência de classificação; -
NTILE(n)
: Divide as linhas em uma partição ordenada emn
grupos e atribui um número de grupo para cada linha.
Exemplo
Vamos classificar as vendas com base no Amount
para cada ProductID
em ordem crescente utilizando a função DENSE_RANK()
:
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
A tabela de resultados contém todas as informações da tabela principal e uma coluna adicional que fornece a classificação de cada venda para o respectivo produto.
Funções de comparação de valores
Funções de comparação de valores em janela no SQL são utilizadas para comparar valores da linha atual com valores de outras linhas dentro da mesma partição.
Essas funções são especialmente úteis para tarefas que envolvem análise de tendências, cálculos baseados em linhas adjacentes ou acesso a valores específicos de linhas dentro de uma janela definida.
Existem várias funções de comparação de valores em SQL:
LAG()
: Recupera o valor de uma linha anterior no conjunto de resultados sem a necessidade de um self-join;LEAD()
: Recupera o valor de uma linha subsequente no conjunto de resultados sem a necessidade de um self-join;FIRST_VALUE()
: Retorna o valor da primeira linha na janela;LAST_VALUE()
: Retorna o valor da última linha na janela.
Exemplo
Vamos utilizar a função de janela de comparação de valores LAG()
para calcular a variação no valor das vendas em relação à venda anterior para cada produto:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Como resultado, é possível extrair facilmente informações sobre as diferenças de vendas para cada produto específico sem utilizar subconsultas ou procedimentos armazenados.
Também é possível calcular as diferenças para todas as vendas sem particionamento utilizando a seguinte consulta:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Você pode notar que não incluímos a cláusula PARTITION BY
no bloco OVER
. Isso significa que não queremos obter os valores anteriores apenas para um produto específico, mas para todas as vendas na tabela.
Obrigado pelo seu feedback!