Questo articolo riguarda le funzioni della finestra T-SQL (Transact-SQL) e il loro utilizzo di base nelle attività quotidiane di analisi dei dati.
Ci sono molte alternative a T-SQL quando si tratta di analisi dei dati. Tuttavia, se si considerano i miglioramenti nel tempo e l'introduzione delle funzioni Window, T-SQL è in grado di eseguire analisi dei dati a livello di base e, in alcuni casi, anche oltre.
Informazioni sulle funzioni della finestra SQL
Innanzitutto, acquisiamo familiarità con le funzioni di SQL Window nel contesto della documentazione Microsoft.
Definizione Microsoft
Una funzione finestra calcola un valore per ogni riga nella finestra.
Definizione semplice
Una funzione finestra ci aiuta a concentrarci su una parte particolare (finestra) del set di risultati in modo da poter eseguire l'analisi dei dati solo su quella parte specifica (finestra), anziché sull'intero set di risultati.
In altre parole, le funzioni della finestra SQL trasformano un set di risultati in diversi set più piccoli per scopi di analisi dei dati.
Cos'è un set di risultati
In poche parole, un set di risultati è costituito da tutti i record recuperati eseguendo una query SQL.
Ad esempio, possiamo creare una tabella denominata Prodotto e inserirvi i seguenti dati:
-- (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')
Ora, il set di risultati recuperato utilizzando lo script seguente conterrà tutte le righe del Prodotto tabella:
-- (3) Result set SELECT [ProductId], [Name],[Region] FROM Product
Cos'è una finestra
È importante prima comprendere il concetto di finestra in relazione alle funzioni della finestra SQL. In questo contesto, una finestra è solo un modo per restringere il tuo ambito mirando a una parte specifica del set di risultati (come abbiamo già menzionato sopra).
Ti starai chiedendo ora:cosa significa effettivamente "mirare a una parte specifica del set di risultati"?
Tornando all'esempio che abbiamo visto, possiamo creare una finestra SQL basata sulla regione del prodotto dividendo il set di risultati in due finestre.
Capire Row_Number()
Per procedere, dovremo utilizzare la funzione Numero_Riga() che fornisce temporaneamente un numero di sequenza alle righe di output.
Ad esempio, se vogliamo aggiungere numeri di riga al set di risultati in base a ProductID, dovremo usare ROW_NUMBER() per ordinarlo in base all'ID prodotto come segue:
--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
Ora, se vogliamo la funzione Numero_Riga() per ordinare il set di risultati tramite ProductID decrescente, quindi la sequenza di righe di output in base a ProductID cambierà come segue:
--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
Non ci sono ancora finestre SQL poiché l'unica cosa che abbiamo fatto è ordinare il set in base a criteri specifici. Come discusso in precedenza, il windowing significa suddividere il set di risultati in diversi insiemi più piccoli per analizzarli separatamente.
Creazione di una finestra con Row_Number()
Per creare una finestra SQL nel nostro set di risultati, dovremo partizionarla in base a una qualsiasi delle colonne che contiene.
Ora possiamo partizionare il set di risultati per regione come segue:
--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
Seleziona – Clausola sopra
In altre parole, Seleziona con il Over La clausola apre la strada alle funzioni della finestra SQL partizionando un set di risultati in finestre più piccole.
Secondo la documentazione Microsoft, Seleziona con Oltre La clausola definisce una finestra che può quindi essere utilizzata da qualsiasi funzione della finestra.
Ora creiamo una tabella chiamata KitchenProduct come segue:
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)
Ora, vediamo la tabella:
SELECT [KitchenProductId], [Name], [Country], [Quantity], [Price] FROM dbo.KitchenProduct
Se si desidera visualizzare ogni prodotto con il proprio numero di serie anziché un numero basato sull'ID prodotto generalizzato, è necessario utilizzare una funzione della finestra SQL per partizionare il set di risultati per prodotto come segue:
-- 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à (Select – Over Clause)
Secondo la documentazione Microsoft , Select – Over Clause è compatibile con le seguenti versioni di database SQL:
- SQL Server 2008 e versioni successive
- Database SQL di Azure
- Data Warehouse SQL di Azure
- Data Warehouse parallelo
Sintassi
SELECT – OVER (Partizione per
Tieni presente che ho semplificato la sintassi per creare i t facile da capire; si prega di fare riferimento a il Documentazione Microsoft per vedere il pieno sintassi.
Prerequisiti
Questo articolo è fondamentalmente scritto per i principianti, ma ci sono ancora alcuni prerequisiti che devono essere tenuti a mente.
Familiarità con T-SQL
Questo articolo presuppone che i lettori abbiano una conoscenza di base di T-SQL e siano in grado di scrivere ed eseguire script SQL di base.
Imposta la tabella di esempio Vendite
Questo articolo richiede la seguente tabella di esempio in modo da poter eseguire i nostri esempi di funzioni della finestra 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
Visualizza tutte le vendite eseguendo il seguente script:
-- View sales SELECT [SalesId],[Product],[Date],[Revenue] FROM dbo.Sales
Raggruppa in base alle funzioni della finestra SQL
Ci si può chiedere:qual è la differenza tra l'utilizzo della clausola Group By e le funzioni della finestra SQL?
Bene, la risposta sta negli esempi seguenti.
Raggruppa per esempio
Per vedere le vendite totali per prodotto, possiamo utilizzare Raggruppa per come segue:
-- Total sales by product using Group By SELECT Product ,SUM(REVENUE) AS Total_Sales FROM dbo.Sales GROUP BY Product ORDER BY Product
Quindi, la clausola Group By ci aiuta a vedere le vendite totali. Il valore totale delle vendite è la somma dei ricavi per tutti i prodotti simili nella stessa riga senza la clausola Group By utilizzata. E se fossimo interessati a vedere le entrate (vendite) di ogni singolo prodotto insieme alle vendite totali?
È qui che entrano in azione le funzioni della finestra SQL.
Esempio di funzione finestra SQL
Per vedere il prodotto, le entrate e le entrate totali di tutti i prodotti simili, dobbiamo suddividere i dati in base al sottoprodotto utilizzando OVER() come segue:
-- Total sales by product using an SQL window function SELECT Product ,REVENUE ,SUM(REVENUE) OVER (PARTITION BY PRODUCT) AS Total_Sales FROM dbo.Sales
L'output dovrebbe essere il seguente:
Quindi, ora possiamo vedere facilmente le vendite per ogni singolo prodotto insieme alle vendite totali per quel prodotto. Ad esempio, le entrate per PC è 100,00 ma le vendite totali (somma delle entrate per il PC prodotto) è 300,00 perché erano in vendita due diversi modelli di PC.
Analisi di base con le funzioni di aggregazione
Le funzioni di aggregazione restituiscono un singolo valore dopo aver eseguito calcoli su un insieme di dati.
In questa sezione, esploreremo ulteriormente le funzioni della finestra SQL, in particolare, utilizzandole insieme alle funzioni aggregate per eseguire l'analisi dei dati di base.
Funzioni aggregate comuni
Le funzioni aggregate più comuni sono:
- Somma
- Conte
- Minimo
- Massimo
- Media (media)
Analisi dei dati aggregati per prodotto
Per analizzare il set di risultati in base al sottoprodotto con l'aiuto di funzioni di aggregazione, dobbiamo semplicemente utilizzare una funzione di aggregazione con una partizione di sottoprodotto all'interno dell'istruzione 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 dai un'occhiata più da vicino al PC o Laptop prodotti, vedrai come le funzioni aggregate stanno lavorando insieme alla funzione della finestra SQL.
Nell'esempio sopra, possiamo vedere che il valore delle entrate per PC è 100.00 la prima volta e 200.00 la prossima volta, ma le vendite totali ammontano a 300.00. Informazioni simili possono essere visualizzate per il resto delle funzioni aggregate.
Analisi dei dati aggregati per data
Ora, eseguiamo alcune analisi dei dati dei prodotti in base alla data utilizzando le funzioni della finestra SQL in combinazione con le funzioni aggregate.
Questa volta, partizioniamo il set di risultati per data anziché per prodotto come segue:
-- 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
Con questo, abbiamo appreso le tecniche di base dell'analisi dei dati utilizzando l'approccio delle funzioni della finestra SQL.
Cose da fare
Ora che hai familiarità con le funzioni della finestra SQL, prova quanto segue:
- Tenendo presente gli esempi che abbiamo esaminato, esegui l'analisi dei dati di base utilizzando le funzioni della finestra SQL sul database di esempio menzionato in questo articolo.
- Aggiungi una colonna Cliente alla tabella di esempio Vendite e scopri quanto può diventare ricca la tua analisi dei dati quando viene aggiunta un'altra colonna (cliente).
- Aggiungere una colonna Regione alla tabella di esempio Vendite ed eseguire l'analisi dei dati di base utilizzando le funzioni aggregate per regione.