Nous pouvons prendre un exemple simple.
Prenons un tableau nommé TableA
avec les valeurs suivantes:
id firstname lastname Mark
-------------------------------------------------------------------
1 arun prasanth 40
2 ann antony 45
3 sruthy abc 41
6 new abc 47
1 arun prasanth 45
1 arun prasanth 49
2 ann antony 49
GROUP BY
La clause SQL GROUP BY peut être utilisée dans une instruction SELECT pour collecter des données sur plusieurs enregistrements et regrouper les résultats par une ou plusieurs colonnes.
En termes plus simples, l'instruction GROUP BY est utilisée conjointement avec les fonctions d'agrégation pour regrouper l'ensemble de résultats par une ou plusieurs colonnes.
Syntaxe:
SELECT expression1, expression2, ... expression_n,
aggregate_function (aggregate_expression)
FROM tables
WHERE conditions
GROUP BY expression1, expression2, ... expression_n;
Nous pouvons appliquer GROUP BY
dans notre tableau:
select SUM(Mark)marksum,firstname from TableA
group by id,firstName
Résultats:
marksum firstname
----------------
94 ann
134 arun
47 new
41 sruthy
Dans notre vrai tableau, nous avons 7 lignes et lorsque nous appliquons GROUP BY id
, le serveur regroupe les résultats en fonction de id
:
En termes simples:
ici GROUP BY
réduit normalement le nombre de lignes renvoyées en les enroulant et en calculant Sum()
pour chaque ligne.
PARTITION BY
Avant de passer à PARTITION BY, regardons la OVER
clause:
Selon la définition MSDN:
La clause OVER définit une fenêtre ou un ensemble de lignes spécifié par l'utilisateur dans un ensemble de résultats de requête. Une fonction de fenêtre calcule ensuite une valeur pour chaque ligne de la fenêtre. Vous pouvez utiliser la clause OVER avec des fonctions pour calculer des valeurs agrégées telles que des moyennes mobiles, des agrégats cumulatifs, des totaux cumulés ou un N supérieur par groupe de résultats.
PARTITION BY ne réduira pas le nombre de lignes renvoyées.
Nous pouvons appliquer PARTITION BY dans notre exemple de tableau:
SELECT SUM(Mark) OVER (PARTITION BY id) AS marksum, firstname FROM TableA
Résultat:
marksum firstname
-------------------
134 arun
134 arun
134 arun
94 ann
94 ann
41 sruthy
47 new
Regardez les résultats - il partitionne les lignes et renvoie toutes les lignes, contrairement à GROUP BY.