J'ai utilisé GROUP BY
pour tous les types de requêtes agrégées au fil des ans. Récemment, j'ai procédé à la rétro-ingénierie d'un code utilisé PARTITION BY
pour effectuer des agrégations. En lisant toute la documentation que je peux trouver PARTITION BY
, cela ressemble beaucoup à GROUP BY
, peut-être avec un peu de fonctionnalités supplémentaires ajoutées? S'agit-il de deux versions de la même fonctionnalité générale ou s'agit-il de quelque chose de complètement différent?
la source
Nous pouvons prendre un exemple simple.
Prenons un tableau nommé
TableA
avec les valeurs suivantes:GROUP BY
Syntaxe:
Nous pouvons appliquer
GROUP BY
dans notre tableau:Résultats:
Dans notre vrai tableau, nous avons 7 lignes et lorsque nous appliquons
GROUP BY id
, le serveur regroupe les résultats en fonction deid
:En termes simples:
PARTITION BY
Avant de passer à PARTITION BY, regardons la
OVER
clause:Selon la définition MSDN:
PARTITION BY ne réduira pas le nombre de lignes renvoyées.
Nous pouvons appliquer PARTITION BY dans notre exemple de tableau:
Résultat:
Regardez les résultats - il partitionne les lignes et renvoie toutes les lignes, contrairement à GROUP BY.
la source
partition by
peut affecter le nombre de lignes, cela ne réduira pas le nombre de lignes.SELECT
passerSELECT DISTINCT
à la deuxième requête? cela ne retournerait-il pas le même ensemble de données que laGROUP BY
requête? Quelles sont les raisons de choisir l'un ou l'autre?partition by
ne fait pas réellement remonter les données. Il vous permet de réinitialiser quelque chose par groupe. Par exemple, vous pouvez obtenir une colonne ordinale au sein d'un groupe en partitionnant le champ de regroupement et en utilisantrownum()
les lignes de ce groupe. Cela vous donne quelque chose qui se comporte un peu comme une colonne d'identité qui se réinitialise au début de chaque groupe.la source
Trouvé sur ce lien: Clause OVER
la source
Il fournit des données cumulées sans remonter
c'est-à-dire supposons que je veuille retourner la position relative de la région de vente
En utilisant PARTITION BY, je peux retourner le montant des ventes pour une région donnée et le montant MAX dans toutes les régions de vente de la même ligne.
Cela signifie que vous aurez des données répétitives, mais cela peut convenir au consommateur final dans le sens où les données ont été agrégées mais aucune donnée n'a été perdue - comme ce serait le cas avec GROUP BY.
la source
PARTITION BY
est analytique, tandis queGROUP BY
est agrégé. Pour l'utiliserPARTITION BY
, vous devez le contenir avec une clause OVER .la source
PARTITION BY is analytic
cette simple déclaration m'a beaucoup éclairé. +1.D'après ce que je comprends, la partition par est presque identique au groupe par, mais avec les différences suivantes:
Ce groupe regroupe en fait le jeu de résultats renvoyant une ligne par groupe, ce qui entraîne donc que SQL Server n'autorise dans la liste SELECT que les fonctions d'agrégation ou les colonnes qui font partie de la clause group by (auquel cas SQL Server peut garantir qu'il existe des fonctions uniques). résultats pour chaque groupe).
Considérez par exemple MySQL qui permet d'avoir dans la liste SELECT des colonnes qui ne sont pas définies dans la clause Group By, auquel cas une ligne est toujours renvoyée par groupe, mais si la colonne n'a pas de résultats uniques, il n'y a aucune garantie quelle sera la sortie!
Mais avec Partition By, bien que les résultats de la fonction soient identiques aux résultats d'une fonction d'agrégation avec Group By, vous obtenez toujours le jeu de résultats normal, ce qui signifie que l'on obtient une ligne par ligne sous-jacente et non une ligne par groupe, et à cause de cela, il peut y avoir des colonnes qui ne sont pas uniques par groupe dans la liste SELECT.
Donc, en résumé, Group By serait mieux quand a besoin d'une sortie d'une ligne par groupe, et Partition By serait mieux quand on a besoin de toutes les lignes mais veut toujours la fonction d'agrégation basée sur un groupe.
Bien sûr, il peut également y avoir des problèmes de performances, voir http://social.msdn.microsoft.com/Forums/ms-MY/transactsql/thread/0b20c2b5-1607-40bc-b7a7-0c60a2a55fba .
la source
Lorsque vous utilisez
GROUP BY
, les lignes résultantes seront généralement inférieures aux lignes entrantes.Mais, lorsque vous utilisez
PARTITION BY
, le nombre de lignes résultant doit être le même que celui entrant.la source
Supposons que nous ayons 14 enregistrements de
name
colonne dans le tableaudans
group by
il donnera le décompte sur une seule ligne soit 14
mais en
partition by
il y aura 14 rangées d'augmentation du nombre
la source
Petite observation. Le mécanisme d'automatisation pour générer dynamiquement du SQL en utilisant la «partition par» est beaucoup plus simple à implémenter par rapport au «group by». Dans le cas de «regrouper par», nous devons nous occuper du contenu de la colonne «sélectionner».
Désolé pour mon anglais.
la source
Il a des scénarios d'utilisation vraiment différents. Lorsque vous utilisez GROUP BY, vous fusionnez certains des enregistrements pour les colonnes identiques et vous disposez d'une agrégation de l'ensemble de résultats.
Cependant, lorsque vous utilisez PARTITION BY, votre jeu de résultats est le même, mais vous disposez simplement d'une agrégation sur les fonctions de la fenêtre et vous ne fusionnez pas les enregistrements, vous aurez toujours le même nombre d'enregistrements.
Voici un article utile sur le rallye expliquant la différence: http://alevryustemov.com/sql/sql-partition-by/
la source
la source