Quelqu'un peut-il expliquer ce que fait le partition by
mot-clé et en donner un exemple simple en action, ainsi que pourquoi on voudrait l'utiliser? J'ai une requête SQL écrite par quelqu'un d'autre et j'essaie de comprendre ce qu'elle fait.
Un exemple de partition par:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
Les exemples que j'ai vus en ligne semblent un peu trop approfondis.
sql
oracle
window-functions
Alex Beardsley
la source
la source
Réponses:
La
PARTITION BY
clause définit la plage d'enregistrements qui seront utilisés pour chaque "GROUPE" dans laOVER
clause.Dans votre exemple SQL,
DEPT_COUNT
renverra le nombre d'employés de ce service pour chaque enregistrement d'employé. (C'est comme si vous dé-nomalisiez laemp
table; vous renvoyez toujours chaque enregistrement dans laemp
table.)S'il y avait une autre colonne (par exemple
state
), alors vous pourriez compter le nombre de départements dans cet État.Il est comme obtenir les résultats d'un
GROUP BY
(SUM
,AVG
, etc.) sans l'agrégation de l'ensemble des résultats (c. -à- suppression des enregistrements correspondants).Il est utile lorsque vous utilisez les fonctions
LAST OVER
ouMIN OVER
pour obtenir, par exemple, le salaire le plus bas et le plus élevé du service, puis que vous l'utilisez dans un calcul par rapport à ces enregistrements de salaire sans sous-sélection, ce qui est beaucoup plus rapide.Lisez l' article AskTom lié pour plus de détails.
la source
last over
etmin over
. J'imagine qu'une sous-sélection serait plus lente, mais la grammaire anglaise dans la réponse ne le suggère pas.Le concept est très bien expliqué par la réponse acceptée, mais je trouve que plus on voit d'exemple, mieux il s'enfonce. Voici un exemple incrémentiel:
1) Le patron dit "obtenez-moi le nombre d'articles que nous avons en stock, groupés par marque"
Vous dites : "pas de problème"
Résultat:
2) Le patron dit "Maintenant, obtenez-moi une liste de tous les articles, avec leur marque ET le nombre d'articles que la marque respective possède"
Vous pouvez essayer:
Mais vous obtenez:
C'est là
OVER (PARTITION BY BRAND)
qu'intervient:Whic signifie:
COUNT(ITEM_ID)
- obtenir le nombre d'articlesOVER
- Sur l'ensemble des rangées(PARTITION BY BRAND)
- qui ont la même marqueEt le résultat est:
etc...
la source
Il s'agit de l'extension SQL appelée analytics. Le "over" dans l'instruction select indique à oracle que la fonction est une fonction analytique, pas un groupe par fonction. L'avantage de l'utilisation de l'analyse est que vous pouvez collecter des sommes, des comptages et bien plus encore avec un seul passage des données au lieu de parcourir les données avec des sous-sélections ou pire, PL / SQL.
Cela semble déroutant au premier abord, mais ce sera rapidement une seconde nature. Personne ne l'explique mieux que Tom Kyte. Le lien ci-dessus est donc génial.
Bien sûr, la lecture de la documentation est indispensable.
la source
Ici, nous obtenons le décompte de chaque département. En ce qui concerne deptno 10, nous avons 4 enregistrements dans le tableau emp des résultats similaires pour deptno 20 et 30 également.
la source
le mot clé over partition est comme si nous partitionnions les données en créant client_id un sous-ensemble de chaque identifiant client
cette requête renverra le nombre d'opérations effectuées par le client_id
la source
Je pense que cet exemple suggère une petite nuance sur la façon dont le partitionnement fonctionne et comment le groupe par fonctionne. Mon exemple vient d'Oracle 12, si mon exemple se trouve être un bogue de compilation.
J'ai essayé :
Cela fonctionne cependant comme prévu:
Produire le nombre d'éléments dans chaque état sur la base de la clé externe "clé_données". Donc, si data_key = 'APPLE' avait 3 lignes avec l'état 'A', 2 lignes avec l'état 'B', une ligne avec l'état 'C', la ligne correspondante pour 'APPLE' serait 'APPLE', 3, 2 , 1, 6.
la source