Olá amigos, uma situação comum que vivemos no nosso universo da programação é a necessidade de recuperar dados agrupados e ordenados por um determinado critério, o que nos permite por exemplo, saber por produto, o volume de vendas por cidade, onde as cidades com mais vendas vem primeiro.

Este problema se resolve facilmente fazendo uma consulta simples na tabela de vendas agrupando os produtos, as cidades e contando as vendas como demonstrado abaixo:

Volume de Vendas por Cidade

 

Vale lembrar que a estrutura montada tem o intuito apenas didático, assim não cabe aqui a discussão sobre a estrutura adotada.

Porém como devemos fazer diante da necessidade de listar para cada um destes produtos, as 5 cidades onde ocorram o maior volume de vendas, ainda ordenando da com maior volume para a de menor?

Resolvendo o problema

Usando o mesmo exemplo acima, vou demonstrar uma forma simples de resolver este problema usando Ranking Functions, especificamente o row_number(), e CTE’s (Common Table Expressions).

As Ranking Functions permitem que criemos um rank para os dados de uma consulta baseados em um critério. No caso da função row_number(), é dado um “Id” que representa um sequencial para a linha baseado no critério de particionamento informado (imagem abaixo).

 

Volume de Vendas por Cidade com rank

Veja que ao usar a função row_number(), informamos um critério de partição e uma ordenação para os dados.

O critério de particionamento é a coluna a qual o sistema irá usar para saber quando “reiniciar” a contagem das linhas. No meu exemplo, usei a coluna [Produto], veja pela imagem que cada produto tem uma numeração de 1 até a quantidade de ocorrências retornadas pela consulta.

a ordenação informada, serve para dizer em qual coluna ele deve se basear para ordenar os dados. Como nossa ordenação é baseada na maior soma de vendas para a menor, o nosso order by foi pela soma da quantidade em ordem decrescente. Porém, se quiséssemos, poderíamos ter ordenado por cidade ou produto, onde a numeração ficaria na verdade como abaixo.

Volume de Vendas por Cidade com rank

 

 

Já temos nosso insumo para realizar nosso feito, inclusive acredito que a maioria agora já deve ter em mente como recuperar os dados.

Devido ao volume de dados para testes deste post serem limitados, vou mostrar como recuperar os dados, porém apenas das duas primeiras cidades por produto.

Para isto, vamos usar um CTE, cujo uma das funções é pegar uma expressão e dispor seu resultado na forma de uma tabela, como abaixo.

Volume de Vendas por Cidade com rank cte

Veja que fiz a consulta anterior, sem a ordenação, se comportar como uma tabela que usei na segunda consulta.

Agora basta um simples Where e tudo resolvido

Volume de Vendas por Cidade com rank cte final

 

E pronto, tempos nossa consulta retornando as duas cidades com mais vendas por produto.