Este artigo é sobre as funções da janela T-SQL (Transact-SQL) e seu uso básico em tarefas diárias de análise de dados.
Existem muitas alternativas ao T-SQL quando se trata de análise de dados. No entanto, quando são consideradas as melhorias ao longo do tempo e a introdução de funções do Windows, o T-SQL é capaz de realizar a análise de dados em um nível básico e, em alguns casos, até além disso.
Sobre as funções da janela SQL
Primeiro, vamos nos familiarizar com as funções do SQL Window no contexto da documentação da Microsoft.
Definição da Microsoft
Uma função de janela calcula um valor para cada linha na janela.
Definição simples
Uma função de janela nos ajuda a focar em uma parte específica (janela) do conjunto de resultados para que possamos realizar a análise de dados apenas nessa parte específica (janela), em vez de em todo o conjunto de resultados.
Em outras palavras, as funções da janela SQL transformam um conjunto de resultados em vários conjuntos menores para fins de análise de dados.
O que é um conjunto de resultados
Simplificando, um conjunto de resultados consiste em todos os registros recuperados pela execução de uma consulta SQL.
Por exemplo, podemos criar uma tabela chamada Produto e insira os seguintes dados nele:
-- (1) Create the Product table CREATE TABLE [dbo].[Product] ( [ProductId] INT NOT NULL PRIMARY KEY, [Name] VARCHAR(40) NOT NULL, [Region] VARCHAR(40) NOT NULL ) -- (2) Populate the Product table INSERT INTO Product (ProductId,Name,Region) VALUES (1,'Laptop','UK'),(2,'PC','UAE'),(3,'iPad','UK')
Agora, o conjunto de resultados recuperado usando o script abaixo conterá todas as linhas do Produto tabela:
-- (3) Result set SELECT [ProductId], [Name],[Region] FROM Product
O que é uma janela
É importante primeiro entender o conceito de uma janela no que se refere às funções da janela SQL. Nesse contexto, uma janela é apenas uma maneira de restringir seu escopo, visando uma parte específica do conjunto de resultados (como já mencionamos acima).
Você pode estar se perguntando agora – o que realmente significa “segmentar uma parte específica do conjunto de resultados”?
Voltando ao exemplo que vimos, podemos criar uma janela SQL baseada na região do produto dividindo o conjunto de resultados em duas janelas.
Compreendendo Row_Number()
Para continuar, precisaremos usar a função Row_Number() que fornece temporariamente um número de sequência para as linhas de saída.
Por exemplo, se quisermos adicionar números de linha ao conjunto de resultados com base em ProductID, precisaremos usar ROW_NUMBER() para encomendá-lo por ID do produto da seguinte forma:
--Using the row_number() function to order the result set by ProductID SELECT ProductID,ROW_NUMBER() OVER (ORDER BY ProductID) AS SrNo,Name,Region FROM Product
Agora, se queremos a função Row_Number() para ordenar o conjunto de resultados por ProductID decrescente, a sequência de linhas de saída com base em ProductID mudará da seguinte forma:
--Using the row_number() function to order the result set by ProductID descending SELECT ProductID,ROW_NUMBER() OVER (ORDER BY ProductID DESC) AS SrNo,Name,Region FROM Product
Ainda não há janelas SQL, pois a única coisa que fizemos foi ordenar o conjunto por critérios específicos. Conforme discutido anteriormente, janelar significa dividir o conjunto de resultados em vários conjuntos menores para analisar cada um deles separadamente.
Criando uma janela com Row_Number()
Para criar uma janela SQL em nosso conjunto de resultados, precisaremos particioná-la com base em qualquer uma das colunas que ela contém.
Agora podemos particionar o conjunto de resultados por região da seguinte forma:
--Creating a SQL window based on Region SELECT ROW_NUMBER() OVER (Partition by region ORDER BY Region) as Region_Serial_Number , Name, Region FROM dbo.Product
Selecionar – Cláusula Sobre
Em outras palavras, Selecionar com o Sobre A cláusula abre o caminho para funções de janela SQL particionando um conjunto de resultados em janelas menores.
De acordo com a documentação da Microsoft, Selecionar com o Sobre A cláusula define uma janela que pode ser usada por qualquer função de janela.
Agora, vamos criar uma tabela chamada KitchenProduct do seguinte modo:
CREATE TABLE [dbo].[KitchenProduct] ( [KitchenProductId] INT NOT NULL PRIMARY KEY IDENTITY(1,1), [Name] VARCHAR(40) NOT NULL, [Country] VARCHAR(40) NOT NULL, [Quantity] INT NOT NULL, [Price] DECIMAL(10,2) NOT NULL ); GO INSERT INTO dbo.KitchenProduct (Name, Country, Quantity, Price) VALUES ('Kettle','Germany',10,15.00) ,('Kettle','UK',20,12.00) ,('Toaster', 'France',10,10.00) ,('Toaster','UAE',10,12.00) ,('Kitchen Clock','UK',50,20.00) ,('Kitchen Clock','UAE',35,15.00)
Agora vamos ver a tabela:
SELECT [KitchenProductId], [Name], [Country], [Quantity], [Price] FROM dbo.KitchenProduct
Se você quiser ver cada produto com seu próprio número de série em vez de um número baseado no ID do produto generalizado, será necessário usar uma função de janela SQL para particionar o conjunto de resultados por produto da seguinte maneira:
-- Viewing each product in its own series SELECT ROW_NUMBER() OVER (Partition by Name order by Name) Product_SrNo,Name,Country,Quantity FROM dbo.KitchenProduct
Compatibilidade (Selecionar - Cláusula Sobre)
De acordo com a documentação da Microsoft , Select – Over Clause é compatível com as seguintes versões de banco de dados SQL:
- SQL Server 2008 e superior
- Banco de dados SQL do Azure
- Azure SQL Data Warehouse
- Armazém de dados paralelo
Sintaxe
SELECT – OVER (Partição por
Observe que simplifiquei a sintaxe para fazer i t fácil de entender; consulte o Documentação da Microsoft para ver completo sintaxe.
Pré-requisitos
Este artigo foi escrito basicamente para iniciantes, mas ainda existem alguns pré-requisitos que devem ser mantidos em mente.
Familiaridade com T-SQL
Este artigo pressupõe que os leitores tenham um conhecimento básico de T-SQL e sejam capazes de escrever e executar scripts SQL básicos.
Configure a tabela de amostra de vendas
Este artigo requer a seguinte tabela de amostra para que possamos executar nossos exemplos de função de janela SQL:
-- (1) Create the Sales sample table CREATE TABLE [dbo].[Sales] ( [SalesId] INT NOT NULL IDENTITY(1,1), [Product] VARCHAR(40) NOT NULL, [Date] DATETIME2, [Revenue] DECIMAL(10,2), CONSTRAINT [PK_Sales] PRIMARY KEY ([SalesId]) ); GO -- (2) Populating the Sales sample table SET IDENTITY_INSERT [dbo].[Sales] ON INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (1, N'Laptop', N'2017-01-01 00:00:00', CAST(200.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (2, N'PC', N'2017-01-01 00:00:00', CAST(100.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (3, N'Mobile Phone', N'2018-01-01 00:00:00', CAST(300.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (4, N'Accessories', N'2018-01-01 00:00:00', CAST(150.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (5, N'iPad', N'2019-01-01 00:00:00', CAST(300.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (6, N'PC', N'2019-01-01 00:00:00', CAST(200.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (7, N'Laptop', N'2019-01-01 00:00:00', CAST(300.00 AS Decimal(10, 2))) SET IDENTITY_INSERT [dbo].[Sales] OFF
Visualize todas as vendas executando o seguinte script:
-- View sales SELECT [SalesId],[Product],[Date],[Revenue] FROM dbo.Sales
Agrupar por vs funções de janela SQL
Pode-se perguntar – qual é a diferença entre usar a cláusula Group By e as funções da janela SQL?
Bem, a resposta está nos exemplos abaixo.
Agrupar por exemplo
Para ver o total de vendas por produto, podemos usar Group By da seguinte forma:
-- Total sales by product using Group By SELECT Product ,SUM(REVENUE) AS Total_Sales FROM dbo.Sales GROUP BY Product ORDER BY Product
Então, a cláusula Group By nos ajuda a ver o total de vendas. O valor total de vendas é a soma da receita de todos os produtos semelhantes na mesma linha sem a cláusula Group By usada. E se estivermos interessados em ver a receita (venda) de cada produto individual junto com as vendas totais?
É aqui que as funções da janela SQL entram em ação.
Exemplo de função de janela SQL
Para ver o produto, a receita e a receita total de todos os produtos semelhantes, precisamos particionar os dados por produto usando OVER() do seguinte modo:
-- Total sales by product using an SQL window function SELECT Product ,REVENUE ,SUM(REVENUE) OVER (PARTITION BY PRODUCT) AS Total_Sales FROM dbo.Sales
A saída deve ser a seguinte:
Assim, agora podemos ver facilmente as vendas de cada produto individual, juntamente com as vendas totais desse produto. Por exemplo, a receita de PC é 100,00, mas as vendas totais (soma da receita do PC produto) é 300,00 porque dois modelos diferentes de PC estavam sendo vendidos.
Análise básica com as funções agregadas
As funções agregadas retornam um único valor após realizar cálculos em um conjunto de dados.
Nesta seção, exploraremos ainda mais as funções da janela SQL – especificamente, usando-as junto com funções agregadas para realizar análises básicas de dados.
Funções Agregadas Comuns
As funções agregadas mais comuns são:
- Soma
- Contagem
- Mínimo
- Máx.
- Média (média)
Análise de dados agregados por produto
Para analisar o conjunto de resultados em uma base de subproduto com a ajuda de funções de agregação, simplesmente temos que usar uma função de agregação com uma partição de subproduto dentro da instrução OVER():
-- Data analysis by product using aggregate functions SELECT Product,Revenue ,SUM(REVENUE) OVER (PARTITION BY PRODUCT) as Total_Sales ,MIN(REVENUE) OVER (PARTITION BY PRODUCT) as Minimum_Sales ,MAX(REVENUE) OVER (PARTITION BY PRODUCT) as Maximum_Sales ,AVG(REVENUE) OVER (PARTITION BY PRODUCT) as Average_Sales FROM dbo.Sales
Se você observar mais de perto o PC ou Notebook produtos, você verá como as funções agregadas estão trabalhando juntas junto com a função de janela SQL.
No exemplo acima, podemos ver que o valor de Receita para PC é 100,00 na primeira vez e 200,00 na próxima, mas as vendas totais chegam a 300,00. As informações semelhantes podem ser vistas para o restante das funções agregadas.
Análise de dados agregados por data
Agora, vamos realizar algumas análises de dados dos produtos por data usando funções de janela SQL em combinação com funções agregadas.
Desta vez, vamos particionar o conjunto de resultados por data e não por produto da seguinte forma:
-- Data analysis by date using aggregate functions SELECT Product,date,Revenue ,SUM(REVENUE) OVER (PARTITION BY DATE) as Total_Sales ,MIN(REVENUE) OVER (PARTITION BY DATE) as Minimum_Sales ,MAX(REVENUE) OVER (PARTITION BY DATE) as Maximum_Sales ,AVG(REVENUE) OVER (PARTITION BY DATE) as Average_Sales FROM dbo.Sales
Com isso, aprendemos técnicas básicas de análise de dados usando a abordagem de funções de janela SQL.
Coisas para fazer
Agora que você está familiarizado com as funções da janela SQL, tente o seguinte:
- Tendo em mente os exemplos que analisamos, realize análises básicas de dados usando funções de janela SQL no banco de dados de amostra mencionado neste artigo.
- Adicione uma coluna de cliente à tabela de amostra de vendas e veja o quão rica sua análise de dados pode se tornar quando outra coluna (cliente) é adicionada a ela.
- Adicionar uma coluna de região à tabela de amostra de vendas e realizar análises básicas de dados usando funções agregadas por região.