Database
 sql >> Base de données >  >> RDS >> Database

Apprenez l'analyse de données de base avec les fonctions de fenêtre SQL

Cet article concerne les fonctions de fenêtre T-SQL (Transact-SQL) et leur utilisation de base dans les tâches d'analyse de données quotidiennes.

Il existe de nombreuses alternatives à T-SQL en matière d'analyse de données. Cependant, lorsque des améliorations au fil du temps et l'introduction de fonctions de fenêtre sont envisagées, T-SQL est capable d'effectuer une analyse de données à un niveau de base et, dans certains cas, même au-delà.

À propos des fonctions de fenêtre SQL

Tout d'abord, familiarisons-nous d'abord avec les fonctions SQL Window dans le contexte de la documentation Microsoft.

Définition Microsoft

Une fonction de fenêtre calcule une valeur pour chaque ligne de la fenêtre.

Définition simple

Une fonction de fenêtre nous aide à nous concentrer sur une partie particulière (fenêtre) de l'ensemble de résultats afin que nous puissions effectuer une analyse des données sur cette partie spécifique (fenêtre) uniquement, plutôt que sur l'ensemble des résultats.

En d'autres termes, les fonctions de fenêtre SQL transforment un ensemble de résultats en plusieurs ensembles plus petits à des fins d'analyse de données.

Qu'est-ce qu'un ensemble de résultats

En termes simples, un jeu de résultats se compose de tous les enregistrements récupérés en exécutant une requête SQL.

Par exemple, nous pouvons créer une table nommée Produit et insérez-y les données suivantes :

-- (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')

Désormais, le jeu de résultats récupéré à l'aide du script ci-dessous contiendra toutes les lignes du Produit tableau :

-- (3) Result set
SELECT [ProductId], [Name],[Region] FROM Product

Qu'est-ce qu'une fenêtre

Il est important de comprendre d'abord le concept de fenêtre en ce qui concerne les fonctions de fenêtre SQL. Dans ce contexte, une fenêtre n'est qu'un moyen de réduire votre portée en ciblant une partie spécifique de l'ensemble de résultats (comme nous l'avons déjà mentionné ci-dessus).

Vous vous demandez peut-être maintenant :que signifie réellement « ciblage d'une partie spécifique de l'ensemble de résultats » ?

En revenant à l'exemple que nous avons vu, nous pouvons créer une fenêtre SQL basée sur la région du produit en divisant le jeu de résultats en deux fenêtres.

Comprendre Row_Number()

Pour continuer, nous devrons utiliser la fonction Row_Number() qui donne temporairement un numéro de séquence aux lignes de sortie.

Par exemple, si nous voulons ajouter un numéro de ligne au jeu de résultats basé sur ProductID, nous devrons utiliser ROW_NUMBER() pour le commander par Product ID comme suit :

--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

Maintenant, si nous voulons la fonction Row_Number() pour trier le jeu de résultats par ProductID décroissant, puis la séquence de lignes de sortie basée sur ProductID changera comme suit :

--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

Il n'y a pas encore de fenêtres SQL puisque la seule chose que nous ayons faite est de classer l'ensemble selon des critères spécifiques. Comme indiqué précédemment, le fenêtrage consiste à diviser le jeu de résultats en plusieurs ensembles plus petits pour analyser chacun d'eux séparément.

Créer une fenêtre avec Row_Number()

Pour créer une fenêtre SQL dans notre jeu de résultats, nous devrons la partitionner en fonction de l'une des colonnes qu'elle contient.

Nous pouvons maintenant partitionner le jeu de résultats par région comme suit :

--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

Sélectionner - Clause supérieure

En d'autres termes, Sélectionner avec le Plus La clause ouvre la voie aux fonctions de fenêtre SQL en partitionnant un jeu de résultats en fenêtres plus petites.

Selon la documentation Microsoft, Sélectionner avec le Plus La clause définit une fenêtre qui peut ensuite être utilisée par n'importe quelle fonction de fenêtre.

Maintenant, créons une table appelée KitchenProduct comme suit :

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)

Maintenant, regardons le tableau :

SELECT [KitchenProductId], [Name], [Country], [Quantity], [Price] FROM dbo.KitchenProduct

Si vous souhaitez voir chaque produit avec son propre numéro de série plutôt qu'un numéro basé sur l'ID de produit généralisé, vous devrez utiliser une fonction de fenêtre SQL pour partitionner le jeu de résultats par produit comme suit :

-- 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

Compatibilité (Sélectionner - Clause supérieure)

Selon la documentation Microsoft , Select – Over Clause est compatible avec les versions de bases de données SQL suivantes :

  1. SQL Server 2008 et versions ultérieures
  2. Base de données SQL Azure
  3. Entrepôt de données SQL Azure
  4. Entrepôt de données parallèle

Syntaxe

SELECT – OVER (Partitionner par Trier par )

Veuillez noter que j'ai simplifié la syntaxe pour le faire l facile à comprendre ; veuillez vous référer à le Documentation Microsoft pour voir le plein syntaxe.

Pré-requis

Cet article est essentiellement écrit pour les débutants, mais il y a encore quelques pré-requis qui doivent être gardés à l'esprit.

Familiarité avec T-SQL

Cet article suppose que les lecteurs ont une connaissance de base de T-SQL et sont capables d'écrire et d'exécuter des scripts SQL de base.

Configurer l'exemple de tableau Ventes

Cet article nécessite l'exemple de table suivant afin que nous puissions exécuter nos exemples de fonctions de fenêtre 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

Affichez toutes les ventes en exécutant le script suivant :

-- View sales
SELECT
  [SalesId],[Product],[Date],[Revenue]
FROM dbo.Sales

Grouper par vs fonctions de fenêtre SQL

On peut se demander quelle est la différence entre l'utilisation de la clause Group By et les fonctions de fenêtre SQL ?

Eh bien, la réponse se trouve dans les exemples ci-dessous.

Regrouper par exemple

Afin de voir les ventes totales par produit, nous pouvons utiliser Grouper par comme suit :

-- Total sales by product using Group By
SELECT
  Product
 ,SUM(REVENUE) AS Total_Sales
FROM dbo.Sales
GROUP BY Product
ORDER BY Product

Ainsi, la clause Group By nous aide à voir le total des ventes. La valeur totale des ventes est la somme des revenus de tous les produits similaires dans la même ligne sans qu'aucune clause Group By ne soit utilisée. Que se passe-t-il si nous souhaitons voir les revenus (ventes) de chaque produit individuel ainsi que les ventes totales ?

C'est là que les fonctions de fenêtre SQL entrent en action.

Exemple de fonction de fenêtre SQL

Afin de voir le produit, les revenus et les revenus totaux de tous les produits similaires, nous devons partitionner les données par sous-produit à l'aide de OVER() comme suit :

-- Total sales by product using an SQL window function
SELECT
  Product
 ,REVENUE
 ,SUM(REVENUE) OVER (PARTITION BY PRODUCT) AS Total_Sales
FROM dbo.Sales

Le résultat devrait être le suivant :

Ainsi, nous pouvons désormais voir facilement les ventes de chaque produit individuel ainsi que les ventes totales de ce produit. Par exemple, les revenus pour PC est de 100,00 mais les ventes totales (somme des revenus pour le PC produit) est de 300,00 car deux modèles de PC différents étaient vendus.

Analyse de base avec les fonctions d'agrégation

Les fonctions d'agrégation renvoient une seule valeur après avoir effectué des calculs sur un ensemble de données.

Dans cette section, nous allons explorer davantage les fonctions de fenêtre SQL, en particulier en les utilisant avec des fonctions d'agrégation pour effectuer une analyse de données de base.

Fonctions d'agrégation communes

Les fonctions d'agrégation les plus courantes sont :

  1. Somme
  2. Compter
  3. Min
  4. Maximum
  5. Moy (Moyenne)

Analyse des données agrégées par produit

Afin d'analyser le jeu de résultats sur une base de sous-produit à l'aide de fonctions d'agrégation, nous devons simplement utiliser une fonction d'agrégation avec une partition de sous-produit à l'intérieur de l'instruction 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

Si vous regardez de plus près le PC ou ordinateur portable produits, vous verrez comment les fonctions d'agrégat fonctionnent avec la fonction de fenêtre SQL.

Dans l'exemple ci-dessus, nous pouvons voir que la valeur de revenu pour PC est de 100,00 la première fois et de 200,00 la prochaine fois, mais le total des ventes s'élève à 300,00. Les informations similaires peuvent être vues pour le reste des fonctions d'agrégation.

Analyse des données agrégées par date

Maintenant, effectuons une analyse des données des produits par date en utilisant des fonctions de fenêtre SQL en combinaison avec des fonctions d'agrégation.

Cette fois, nous allons partitionner le jeu de résultats par date plutôt que par produit comme suit :

-- 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

Avec cela, nous avons appris les techniques de base d'analyse de données en utilisant l'approche des fonctions de fenêtre SQL.

Choses à faire

Maintenant que vous êtes familiarisé avec les fonctions de fenêtre SQL, essayez ce qui suit :

  1. En gardant à l'esprit les exemples que nous avons examinés, effectuez une analyse de base des données à l'aide des fonctions de fenêtre SQL sur l'exemple de base de données mentionné dans cet article.
  2. Ajoutez une colonne Client à l'exemple de table Ventes et voyez à quel point votre analyse de données peut devenir riche lorsqu'une autre colonne (client) y est ajoutée.
  3. Ajouter une colonne Région à l'exemple de table Ventes et effectuer une analyse de base des données à l'aide de fonctions d'agrégation par région