Un Blog su SQL Server e dintorni organizzato In Pillole

Media, mediana e deviazione standard in SQL Server

Il titolo è molto generico e potrebbe far pensare a chissà quale tipo di analisi 🙂 Premetto non sono un data scientist né tantomeno ci vado vicino, vorrei solo dare qualche spunto per poter fare qualche considerazione sui dati raccolti da un’applicazione.

Vorrei parlare di media, mediana, varianza/deviazione standard e dei percentili.

Ci sono molte situazioni in cui ci viene chiesto di calcolare almeno una di queste informazioni, basti pensare a tabelle di metriche dove magari vogliamo recuperare i tempi medi di alcune operazioni, oppure mi vengono in mente le classiche situazioni di vendita dove ci interessa capire come si comporta il prezzo di un prodotto e di conseguenza la sua vendita.

Difficile parlare di questi comandi SQL senza lavorare su un caso d’uso reale.

Lo script è molto piccolo, crea un database di appoggio nel quale va ad aggiungere una semplice tabella di metriche per la raccolta dei tempi di alcune operazioni di un’immaginaria catena produttiva.

use [master];
go

drop database AnalisiDati;
go

-- creazione database
create database AnalisiDati
go

use [AnalisiDati]
go

create table MetricheProduzione (
	Id int identity(1,1),
	Operazione varchar(36) not null,
	DurataSecondi int null
);
go

-- inseriamo alcuni valori randomici
insert into MetricheProduzione(Operazione, DurataSecondi)
select 'OPERAZIONE_A', abs(checksum(newid()))%10000
from
	sys.objects s1, sys.objects s2

insert into MetricheProduzione(Operazione, DurataSecondi)
select 'OPERAZIONE_B', abs(checksum(newid()))%10
from
	sys.objects s1, sys.objects s2

select 
	Operazione,
	min(DurataSecondi)   as Min,   -- valore minimo
	max(DurataSecondi)   as Max,   -- valore massimo
	avg(DurataSecondi)   as Avg,   -- media aritmetica
	var(DurataSecondi)   as Var,   -- varianza
	stdev(DurataSecondi) as StdDEv -- deviazione standard
from MetricheProduzione group by Operazione;

select distinct
	Operazione,
	PERCENTILE_DISC(0.10) within group (order by DurataSecondi) over (partition by Operazione) as [10Perc],
	PERCENTILE_DISC(0.25) within group (order by DurataSecondi) over (partition by Operazione) as [25Perc],
	PERCENTILE_DISC(0.50) within group (order by DurataSecondi) over (partition by Operazione) as [50Perc],
	PERCENTILE_DISC(0.75) within group (order by DurataSecondi) over (partition by Operazione) as [75Perc],
	PERCENTILE_DISC(0.99) within group (order by DurataSecondi) over (partition by Operazione) as [99Perc]
from MetricheProduzione

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *