logo

Fonctions de fenêtre en SQL

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