Académique Documents
Professionnel Documents
Culture Documents
Lotfi NAJDI
Année Universitaire 2020 / 2021
Licence Professionnelle Génie Informatique
Faculté Polydisciplinaire de Taroudant
Analytic Functions ou windowing functions
SELECT AVG(salary)
FROM employees;
Analytic functions
Qu'est-ce qui rend une fonction analytique ?
• Mot-clé OVER
SELECT employee_id, department_id, salary, • Suivi des parenthèses
SYNTAXE OUTPUT
Agrégation (classique) La requête comprend souvent la clause Retourne une seule ligne
GROUP BY (ou une ligne par groupe
avec)
Analytic function Clause OVER (d'autres éléments) Ne réduit pas le nombre
de lignes
Distribution /
Aggregate Ranking
Analytic
• Les fonctions analytiques calculent une valeur agrégée basée sur un groupe de lignes.
Elles diffèrent des fonctions de groupement du fait qu'elles renvoient plusieurs lignes
pour chaque groupe.
• Le groupe de lignes est appelé une fenêtre window, et est défini par une clause
analytique analytic clause.
• Pour chaque ligne, une fenêtre glissante de lignes (sliding window of rows) est
définie.
• La fenêtre détermine la plage de lignes (range of rows) utilisées pour effectuer les
calculs pour la ligne en cours. La taille de la fenêtre peut être basée soit sur un
nombre physique de lignes (number of rows) , soit sur un intervalle logique comme le
temps par exemple.
Analytic Functions
• Les fonctions analytiques sont la dernière série d'opérations effectuées dans une
• Toutes les jointures et toutes les clauses WHERE, GROUP BY et HAVING sont
• Par conséquent, les fonctions analytiques ne peuvent apparaître que dans la liste des
Ces composants (clauses doivent être déclarer dans l’ordre signalé ) . dans
cet ordre
The QUERY PARTITION CLAUSE
• Si la clause query partition est omise, l'ensemble des résultats est traité
comme une seule partition.
PARTITION BY , n’est pas renseignée
Clause OVER vide, alors la
moyenne présentée est
basée sur toutes les lignes.
SELECT employee_id, department_id, salary,
AVG(salary) OVER ( ) AS avg_salary
FROM employees;
Clause PARTITION BY est bien renseignée Clause PARTITION BY, bien
renseigné , alors la
moyenne présentée est
calculée à l'intérieur de
SELECT employee_id, department_id, salary, chaque d'une partition.
FUNCTION : type de fonction analytique à appliquer {SUM, LEAD, LAG, RANK,, ROWNUMBER, FIRST
VALUE, LAST VALUE,
PARTITION BY : utilisé pour diviser les résultats en groupes (comme le group by dans les fonctions
d’agrégation).Si aucune partition n'est sélectionnée, l'ensemble du résultat est traité comme une seule
partition.
ORDER BY : comment ordonner les groupes ? Cet ordre est très important dans de nombreuses
fonctions analytiques. On peut dire qu'il ne s'agit pas d'une clause order by habituelle. Cette clause peut
modifier les résultats.
WINDOWING CLAUSE : concerne le "nombre de lignes à utiliser lors du regroupement des données.
THE ORDER BY CLAUSE
ASC | DESC : Préciser l'ordre de trie (ascendant ou descendant). ASC est la valeur par
défaut.
NULLS FIRST | NULLS LAST : Préciser si les lignes renvoyées contenant les NULL, doivent
apparaître en haut ou en bas de la liste. NULLS LAST est la valeur par défaut pour l'ordre
croissant, et NULLS FIRST est la valeur par défaut pour l'ordre décroissant.
Analytic Functions ?
Lorsqu’on utilise une fonction d’agrégation , on obtient un seul résultat pour chaque groupe :
UNBOUNDED PRECEDING
Partition 1
RANGE BETWEEN
UNBOUNDED PRECEDING
AND CURRENT ROW
CURENT ROW
UNBOUNDED FOLLOWING
UNBOUNDED PRECEDING
Partition 2
UNBOUNDED FOLLOWING
ROW_NUMBER()
ROW_NUMBER est très utile pour le reporting, en particulier lorsqu’on aimerait avoir des linges
En imbriquant une sous-requête utilisant ROW_NUMBER à l'intérieur d'une autre requête qui
Pour avoir tous les employées qui travaillent dans les départements 10, 20 et 30 et leur attribuer
des numéros selon l'ordre de la date d'embauche.
Trie selon hire_date
Attribuer des numéros
SELECT employee_id, department_id, hire_date, de séquence croissants
ROW_NUMBER() OVER (
PARTITION BY department_id
ORDER BY hire_date ) rownumber
FROM employees
WHERE department_id IN (10, 20, 30)
ORDER BY department_id;
RANK et DENSE_RANK
Les rangs sont des nombres consécutifs commençant par 1 pour chaque
partition.
La différence avec ROW_NUMBER est que les fonctions du type RANK renvoient
Pour RANK et DENSE_RANK, les lignes ayant des valeurs égales pour le critère de
classement reçoivent le même rang.
Pour RANK , les valeurs de rang ne sont pas ignorées en cas d'égalité.
RANK() et DENSE_RANK()
SELECT employee_id, department_id, salary,
RANK() OVER ( PARTITION BY department_id
ORDER BY salary DESC NULLS LAST) rnk,
DENSE_RANK() OVER ( PARTITION BY department_id
ORDER BY salary DESC NULLS LAST) dns_rnk
FROM employees
WHERE department_id IN (10,30,50) ORDER BY department_id;
RANK()
La fonction LAG permet d'accéder à plusieurs lignes d'une table en même temps.
Étant donné une série de lignes renvoyées par une requête et une position du
curseur, LAG donne accès à une ligne à un décalage physique donné (offset )
avant cette position. Si l’offset n’est pas spécifié, sa valeur par défaut est 1.
Le principe de la fonction LEAD est le même que LAG mais donne accès à une
ligne à un décalage physique donné offset au-delà de la ligne courante.
Par exemple, dans une SELECT , cela permet de comparer les valeurs de la ligne
actuelle avec les valeurs d'une ligne précédente.
LAG et LEAD
Offset (nombre entier positif) : combien de lignes en avant | en arrière pour récupérer
Default : une valeur par défaut à retourner par la fonction si l’ Offset pointe vers une ligne
pour indiquer l'ensemble des lignes sur lesquelles la fonction doit être opérée.
fenêtre dans la partition actuelle, ou sur l'ensemble des résultats si aucune clause de
Si aucune clause de fenêtrage n'est spécifiée, cela signifie qu’on fait le calcul sur toute
la partition.
Windowing Clause
que telle, elle ne peut être utilisée que si une clause order by est spécifiée.
Si une clause de fenêtrage est spécifiée, une clause d'ordre doit obligatoirement l'être
aussi.
Les fonctions analytiques qui offre une clause de fenêtrage sont suivies d'un
RANGE BETWEEN spécifie la fenêtre comme une plage logique . fait référence à une plage
de valeurs dans une colonne spécifique par rapport à la valeur de la ligne en cours.
Windowing Clause
Ces deux mots clés définissent pour chaque ligne une fenêtre (un ensemble physique ou
dans la partition
Windowing Clause
ROWS | RANGE
BETWEEN
UNBOUNDED PRECEDING
| CURRENT ROW
| value_expr { PRECEDING | FOLLOWING }
AND
UNBOUNDED FOLLOWING
| CURRENT ROW
| value_expr { PRECEDING | FOLLOWING }
Windowing Clause
CURRENT ROW : la fenêtre commence ou se termine à la ligne en cours. Peut être utilisée comme
start_point ou end_point.
VALUE | EXPRESSION FOLLOWING : comme la précédente , mais avec un décalage après la ligne
actuelle.
ORDER BY windowing clause (default)
WINDOWING CLAUSE RANGE BETWEEN UNBOUNDED
PRECEDING AND CURRENT ROW
LIGNE en cours , 1
PRECEDENT ET 2 SUIVANT
somme de 4 valeurs
WINDOWING CLAUSE UNBOUNDED PRECEDING
Commencer depuis la
première ligne de la partition
SELECT employee_id, department_id, salary,
SUM(salary) OVER ( PARTITION BY department_id
ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING ) windowing
FROM employees
WHERE department_id in (10,20,30)
ORDER BY department_id,salary ;
WINDOWING CLAUSE Equivalent à ne pas mettre
ORDER BY c.-à-d. sans
windowing (par défaut) .
SELECT employee_id, department_id, salary,
SUM(salary) OVER ( PARTITION BY department_id
ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
windowing
FROM employees WHERE department_id in (10,20,30)
ORDER BY department_id,salary ;
FIRST_VALUE renvoie la première valeur des partitions après avoir fait la clause order
by.
{ RESPECT | IGNORE } NULLS clause, spécifie la prise en compte ou non des valeurs
les fonctions suivies d'un astérisque (*) permettent la syntaxe complète, y compris la clause_fenêtre.