Les fonctions de fenêtre s'appliquent aux fonctions d'agrégation et de classement sur une fenêtre particulière (ensemble de lignes). La clause OVER est utilisée avec les fonctions de fenêtre pour définir cette fenêtre. La clause OVER fait deux choses :
- Partitionne les lignes pour former un ensemble de lignes. (La clause PARTITION BY est utilisée)
- Trie les lignes de ces partitions dans un ordre particulier. (La clause ORDER BY est utilisée)
Note: Si les partitions ne sont pas effectuées, alors ORDER BY classe toutes les lignes de la table.
paramètres Java par défaut
Syntaxe:
SELECT coulmn_name1, window_function(cloumn_name2) OVER([PARTITION BY column_name1] [ORDER BY column_name3]) AS new_column FROM table_name; window_function= any aggregate or ranking function column_name1 = column to be selected coulmn_name2= column on which window function is to be applied column_name3 = column on whose basis partition of rows is to be done new_column= Name of new column table_name= Name of table>
Fonction de fenêtre d'agrégation
Diverses fonctions d'agrégation telles que SUM(), COUNT(), AVERAGE(), MAX() et MIN() appliquées sur une fenêtre particulière (ensemble de lignes) sont appelées fonctions de fenêtre d'agrégation.
Considérer ce qui suit employé tableau :
Nom | Âge | Département | Salaire |
---|---|---|---|
Ramesh | vingt | Finance | 50 000 |
Profond | 25 | Ventes | 30 000 |
Suresh | 22 | Finance | 50000 |
RAM | 28 | Finance | 20 000 |
Pradeep | 22 | Ventes | 20 000 |
Exemple -
Trouvez le salaire moyen des employés de chaque département et classez les employés d'un département par âge.
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary FROM employee>
Cela génère ce qui suit :
Nom | Âge | Département | Salaire | Salaire_moy. |
Ramesh | vingt | Finance | 50 000 | 40 000 |
Suresh | 22 | Finance | 50 000 | 40 000 |
RAM | 28 | Finance | 20 000 | 40 000 |
Profond | 25 | Ventes | 30 000 | 25 000 |
Pradeep | 22 | Ventes | 20 000 | 25 000 |
Remarquez comment tous les salaires moyens dans une fenêtre particulière ont la même valeur.
Considérons un autre cas :
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary FROM employee>
Ici, nous classons également les enregistrements dans la partition selon les valeurs d'âge et donc les valeurs moyennes changent selon l'ordre de tri.
Le résultat de la requête ci-dessus sera :
Nom | Âge | Département | Salaire | Salaire_moy. |
---|---|---|---|---|
Ramesh | vingt | Finance | 50 000 | 50 000 |
Suresh | 22 | Finance | 50 000 | 50 000 |
RAM | 28 | Finance | 20 000 | 40 000 |
Pradeep | 22 | Ventes | 20 000 | 20 000 |
Profond | 25 | Ventes | 30 000 | 25 000 |
Par conséquent, nous devons être prudents lorsque nous ajoutons des clauses order by aux fonctions de fenêtre avec des agrégats.
Fonctions de la fenêtre de classement :
Les fonctions de classement sont RANK(), DENSE_RANK(), ROW_NUMBER()
- RANG() -
Comme son nom l'indique, la fonction de classement attribue un rang à toutes les lignes de chaque partition. Le rang est attribué de telle sorte que le rang 1 soit attribué à la première ligne et que les lignes ayant la même valeur se voient attribuer le même rang. Pour le classement suivant après deux valeurs de classement identiques, une valeur de classement sera ignorée. Par exemple, si deux lignes partagent le rang 1, la ligne suivante obtient le rang 3 et non 2.
- DENSE_RANK() –
Il attribue un rang à chaque ligne de la partition. Tout comme la fonction de classement, la première ligne se voit attribuer le rang 1 et les lignes ayant la même valeur ont le même rang. La différence entre RANK() et DENSE_RANK() est que dans DENSE_RANK(), pour le rang suivant après deux mêmes rangs, un entier consécutif est utilisé, aucun rang n'est ignoré.
- ROW_NUMBER() –
ROW_NUMBER() donne à chaque ligne un numéro unique. Il numérote les lignes de une au nombre total de lignes. Les lignes sont regroupées en fonction de leurs valeurs. Chaque groupe est appelé une partition. Dans chaque partition, les lignes reçoivent des numéros les uns après les autres. Il n'y a pas deux lignes ayant le même numéro dans une partition. Cela rend ROW_NUMBER() différent de RANK() et DENSE_RANK(). ROW_NUMBER() identifie de manière unique chaque ligne avec un nombre entier séquentiel. Cela aide avec différents types d’analyse de données.
Note -
ORDER BY() doit être spécifié obligatoirement lors de l'utilisation des fonctions de fenêtre de classement.
Exemple -
Calculer le numéro de ligne, le rang, le rang dense des employés est le tableau des employés en fonction du salaire au sein de chaque département.
SELECT ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) AS emp_row_no, Name, Department, Salary, RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS emp_rank, DENSE_RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS emp_dense_rank FROM employee;>
Le résultat de la requête ci-dessus sera :
emp_row_no | Nom | Département | Salaire | emp_rank | emp_dense_rank |
---|---|---|---|---|---|
1 | Ramesh | Finance | 50 000 | 1 | 1 |
2 | Suresh | Finance | 50 000 | 1 | 1 |
3 | RAM | Finance | 20 000 | 3 | 2 |
1 | Profond | Ventes | 30 000 | 1 | 1 |
2 | Pradeep | Ventes | 20 000 | 2 | 2 |
Ainsi, nous pouvons voir que, comme mentionné dans la définition de ROW_NUMBER(), les numéros de ligne sont des entiers consécutifs au sein de chaque partition. En outre, nous pouvons voir la différence entre le rang et le rang dense : dans un rang dense, il n'y a pas d'écart entre les valeurs de classement alors qu'il y a un écart dans les valeurs de classement après un classement répété.
25 sur 100