Vous êtes sur la page 1sur 69

BASES DE DONNEES AVANCEES

Lotfi NAJDI
Année Universitaire 2020 / 2021
Licence Professionnelle Génie Informatique
Faculté Polydisciplinaire de Taroudant
Analytic Functions ou windowing functions

• Introduites dans Oracle 8i, les fonctions analytique permettent aux


développeurs d'effectuer en SQL des tâches qui étaient auparavant confinées
aux langages procéduraux.

• Pas seulement Oracle :


• Les Analytic Functions font partie de la norme SQL ANSI

• SQL Server , PostgreSQL, MySQL,...

• Permettent d'extraire des informations de manière beaucoup plus simple et


plus performante.

• Par exemple calculer des sommes cumulées, des moyennes mobiles ou


glissantes et d'accéder aux valeurs de la ligne précédente ou suivante.
Fonction de groupement

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

AVG(salary) OVER () AS avg_salary


FROM employees;
Fonction de groupement avec group by

SELECT department_id, AVG(salary) as avg_dept_salary


FROM employees
GROUP BY department_id
ORDER BY department_id;
Analytic functions

SELECT employee_id, department_id, salary,


AVG(salary) OVER (PARTITION BY department_id) AS avg_dept_salary
FROM employees;

• Retourne un résultat pour


chaque enregistrement.
• Sans aucun regroupement
Agrégation vs Analytic functions

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

Intro to SQL Window Functions | Toptal


Pourquoi utiliser des fonctions analytiques ?

 Produire des données de synthèse( agrégations) en détail des lignes


 Éviter les requêtes et sous-requêtes complexes
 Possibilité d’accéder et voir une ligne à partir d'une autre dans les résultats
 Par exemple appliquer une fonction (somme, moyenne…) à un ensemble de
lignes définies par rapport à la ligne courante.
 Utilise une syntaxe facile à lire
 Alternative rapide, efficace et puissante
Types de fonctions analytiques

Distribution /
Aggregate Ranking
Analytic

• SUM • RANK • FIRST_VALUE


• MIN • DENSE_RANK • LAST_VALUE
• MAX • ROW_NUMBER • LAG
• COUNT • NTILE • LEAD
• AVG • … • …
• …
Analytic Functions

• 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

requête, à l'exception de la clause ORDER BY finale.

• Toutes les jointures et toutes les clauses WHERE, GROUP BY et HAVING sont

exécutées avant que les fonctions analytiques ne soient traitées.

• Par conséquent, les fonctions analytiques ne peuvent apparaître que dans la liste des

SELECT ou la clause ORDER BY.


Analytic Functions
syntaxe

la syntaxe de base d'une fonction analytique est la suivante.

analytic_function([ arguments ]) OVER (analytic_clause)


− analytic_function : le nom de la fonction analytique
− over : indique l’utilisation d’une fonction analytique

La clause analytique se décompose en les éléments


optionnels suivants.

[ query_partition_clause ] [ order_by_clause [ windowing_clause ] ]


− La clause de partitionnement
− La clause d'ordre
− La clause de fenêtrage
THE ANALYTIC CLAUSE

Les éléments entre parenthèses


ANALYTIC CLAUSE

 Éléments entre parenthèses de la clause OVER

 Expressions indiquant la méthode de calcul de fonction

 Trois composantes possibles

1. Partition avec query_partition_clause

2. Order avec order_by_clause

3. Windowing à travers windowing_clause

 L’ensemble de ces trois composants ou certains parmi eux peuvent être


optionnels, selon la fonction

 Ces composants (clauses doivent être déclarer dans l’ordre signalé ) . dans
cet ordre
The QUERY PARTITION CLAUSE

Partition by indique un découpage logique.


la fonction analytique utilisée ne calcule qu'à l'intérieur d'une partition.
Query partition clause ou clause de partitionnement

• Exprimée sous la forme de PARTITION BY

• Définit un découpage des données suivant les valeurs des colonnes du


PARTITION BY…

• Chaque valeur définit un groupe logique ou partition, à l'intérieur duquel est


appliquée la fonction analytique. C'est analogue au GROUP BY.

• Le calcul de la fonction analytique est limité à la frontière imposée par ces


partitions, de la même manière qu'une clause GROUP BY influence l'action
d'une fonction agrégée.

• 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.

AVG(salary) OVER (PARTITION BY department_id) AS avg_dept_salary


FROM employees;
Clause PARTITION  Fonction analytique calculée sur un
sous ensembles de lignes.
# PARTITIONS  Les sous-ensembles de lignes
peuvents différer pour chacune des
SELECT employee_id, department_id,job_id, salary, fonctions utilisées.

AVG(salary) OVER (PARTITION BY department_id) AS avg_dept_salary,


AVG(salary) OVER (PARTITION BY job_id) AS avg_job_salary
FROM employees;
Fonction SUM

SELECT SUM(salary) sum_salary


FROM employees;
Fonction SUM

SELECT first_name, last_name, salary,


SUM(salary) OVER() sum_salary
FROM employees;
Fonction SUM
Fonction analytique calculée
sur un sous-ensemble des
enregistrements
SELECT first_name, last_name, salary,
SUM(salary) OVER( PARTITION BY department_id ) sum_salary_dep
FROM employees;
Analytic Functions

FUNCTION (argl, argN) OVER ([PARTITION BY …] [ORDER BY …] [WINDOWING CLAUSE])

 FUNCTION : type de fonction analytique à appliquer {SUM, LEAD, LAG, RANK,, ROWNUMBER, FIRST
VALUE, LAST VALUE,

 OVER : on précise comment utiliser la fonction (comment grouper, comment trier,...)

 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

Comment les données sont triées à l'intérieur de chaque partition.


ORDER BY CLAUSE

La clause d'ordre est de la forme:

ORDER BY<columns> [ASC | DESC] [NULLS FIRST | NULLS LAST]

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 :

Salaire moyen de chaque département

SELECT department_id, AVG(salary) as avg_dept_salary


FROM employees
GROUP BY department_id;

Pour obtenir ces salaires moyens pour chaque employé

SELECT employee_id, department_id, salary,


AVG(salary) OVER (PARTITION BY department_id)
AS avg_dept_salary
FROM employees;
ORDER BY CLAUSE
ORDER BY n’a pas été renseigné. Le résultat retourné par la fonction analytique semble correct.

SELECT employee_id, department_id, salary,


AVG(salary) OVER (PARTITION BY department_id)
AS avg_dept_salary
FROM employees;

 CLAUSE ORDER BY utilisée à l’intérieur de


la fonction analytique
Essayons d’introduire ORDER BY et évaluer le résultat.  Elle modifie les résultat de cette dernière

SELECT employee_id, department_id, salary,


AVG(salary) OVER (PARTITION BY department_id
ORDER BY salary) AS avg_dept_salary
FROM employees;
ORDER BY CLAUSE

• Indique comment les données sont triées à l'intérieur de chaque partition.

• Clause nécessaire pour certaines fonctions.

• Quand elle est utilisée, elle modifie le comportement de la fonction.

• Si une clause ORDER BY est utilisée et qu'une clause de fenêtrage

(windowing_clause), n'est pas précisée, un fenêtrage implicite est appliqué

(RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW).


ORDER BY CLAUSE
 Ordering_clause ORDER BY est spécifiée
 windowing_clause n'est pas précisée
SELECT employee_id, department_id, salary,  fenêtrage implicite appliqué
AVG(salary) OVER (PARTITION BY department_id
ORDER BY salary) AS avg_dept_salary
FROM employees;

UNBOUNDED PRECEDING

Partition 1
RANGE BETWEEN
UNBOUNDED PRECEDING
AND CURRENT ROW

CURENT ROW

UNBOUNDED FOLLOWING
UNBOUNDED PRECEDING

Partition 2
UNBOUNDED FOLLOWING
ROW_NUMBER()

 Cette fonction analytique attribue un numéro de séquence (croissant ) pour chaque

enregistrement à partir de 1 et ce pour chacune des partitions.

 ROW_NUMBER est très utile pour le reporting, en particulier lorsqu’on aimerait avoir des linges

numérotées dans un ordre pour tous les groupes.

 En imbriquant une sous-requête utilisant ROW_NUMBER à l'intérieur d'une autre requête qui

récupère ces valeurs , on peut implémenter des rapports tu type TOP-N.


ROW_NUMBER()

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

 La fonction RANK calcule le rang d'une valeur dans un groupe de valeurs

ordonnées. Le type de retour est un entier.

 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

les mêmes rangs pour les mêmes valeurs.


RANK() et DENSE_RANK()

 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()

SELECT employee_id, department_id, salary,


RANK() OVER (PARTITION BY department_id ORDER BY salary) AS rank_salary
FROM employees;
RANK()
SELECT *
FROM ( SELECT employee_id, department_id, salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary) AS rank_salary
FROM employees )
WHERE rank_salary <= 2 ;
Rapports TOP-N
(Top 2)
LAG et LEAD

 Fonctions analytiques utiles pour accéder aux valeurs de la ligne précédente ou


suivante.

 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

La syntaxe de ces fonctions est de la forme :

LEAD | LAG ( <column_name> , < Offset >, <default> ) OVER (<analytic_clause>)

 Offset (nombre entier positif) : combien de lignes en avant | en arrière pour récupérer

la valeur de la colonne sur un enregistrement qui précède (ou qui suit).

 Default : une valeur par défaut à retourner par la fonction si l’ Offset pointe vers une ligne

en dehors de la plage de partition.


LAG et LEAD

SELECT employee_id, department_id, salary,


LEAD(salary, 1,0) over (partition by department_id order by salary) next_salary,
LAG (salary,1,0) over (partition by department_id order by salary) previous_salary
FROM employees
where department_id IN (10,20,30) ORDER BY department_id;
LAG et LEAD Offset = 2

SELECT employee_id, Department_id, salary,


LEAD(salary, 2,0) OVER (partition by department_id order by salary ) next_salary,
LAG (salary,2,0) OVER (partition by department_id order by salary ) previous_salary
FROM employees
WHERE department_id in (10,20,30)
ORDER BY department_id;
LAG et LEAD ORDER BY DESC

SELECT employee_id, Department_id, salary,


LEAD(salary, 2,0) OVER (partition by department_id order by salary DESC ) next_salary,
LAG (salary,2,0) OVER (partition by department_id order by salary DESC ) previous_salary
FROM employees
WHERE department_id in (10,20,30)
ORDER BY department_id;
LAG et LEAD

SELECT employee_id, first_name, job_id, salary


FROM employees
ORDER BY salary;
LAG Sans Partitionnement

SELECT employee_id, first_name, job_id, salary,


LAG(salary, 1, 0) OVER (ORDER BY salary) AS salary_prev,
salary - LAG(salary, 1, 0) OVER (ORDER BY salary) AS salary_diff
FROM employees;
Possibilité de faire des calculs
dans la même requête
THE WINDOWING CLAUSE

La clause de fenêtrage indique l'ensemble des lignes sur laquelle doit


être appliquée la fonction.
Windowing Clause

 Certaines fonctions analytiques offrent une clause de fenêtrage ou Windowing Clause

pour indiquer l'ensemble des lignes sur lesquelles la fonction doit être opérée.

 Windowing clause donne à ces fonctions un degré supplémentaire de contrôle sur la

fenêtre dans la partition actuelle, ou sur l'ensemble des résultats si aucune clause de

partition n'est utilisée.

 Si aucune clause de fenêtrage n'est spécifiée, cela signifie qu’on fait le calcul sur toute

la partition.
Windowing Clause

 La clause de fenêtrage windowing est une extension de la clause order by et en tant

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

astérisque (*) dans la documentation ORACLE.


Windowing Clause

Peut prendre deux formes de base :

 ROWS BETWEEN start_point AND end_point


 RANGE BETWEEN start_point AND end_point

 ROWS BETWEEN spécifie la fenêtre en unités physiques .Précise un nombre spécifique de

lignes par rapport à la ligne actuelle. Avec les limites de la partition

 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

Peut prendre deux formes de base :

 ROWS BETWEEN start_point AND end_point


 RANGE BETWEEN start_point AND end_point

 Ces deux mots clés définissent pour chaque ligne une fenêtre (un ensemble physique ou

logique de lignes) utilisée pour calculer le résultat de la fonction.

 La fonction est ensuite appliquée à toutes les lignes de la fenêtre.

 La fenêtre se déplace de haut en bas dans l'ensemble des résultats de la requête 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

Les valeurs possibles pour start_point et end_point :

 UNBOUNDED PRECEDING : la fenêtre commence à la première ligne de la partition, ou au début de


l'ensemble du résultat si aucune clause de partition n'est utilisée. Disponible uniquement comme
start_point.

 UNBOUNDED FOLLOWING : la fenêtre se termine à la dernière ligne de la partition, ou à la fin de


l'ensemble du résultat défini si aucune clause de partition n'est utilisée. Disponible uniquement comme
end_point .

 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 PRECEDING : valeur spécifique pour le start_point de ROWS BETWEEN ou un


décalage logique pour le start_point de RANGE_BETWEEN.

 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

SELECT employee_id, department_id, salary,


SUM(salary) over (partition by department_id order by salary) windowing
FROM employees where department_id in (10,20,30)
ORDER BY department_id,salary ;
WINDOWING CLAUSE
WINDOWING CLAUSE explicite
SELECT employee_id, department_id, salary,
SUM(salary) OVER (
PARTITION BY department_id
ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS windowing
FROM employees where department_id in (10,20,30)
ORDER BY department_id,salary ; Même résultat que le précèdent

ORDER BY salary (requête précédente ) ORDER BY salary


RANGE BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW
WINDOWING CLAUSE
Modifier WINDOWING CLAUSE
SELECT employee_id, department_id, salary, RANGE BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
SUM(salary) OVER (
PARTITION BY department_id
ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING) AS windowing
FROM employees WHERE department_id in (10,20,30)
ORDER BY department_id,salary ;
WINDOWING CLAUSE WINDOWING CLAUSE
ROWS 1 PRECEDING

SELECT employee_id, department_id, salary,


SUM(salary) OVER (PARTITION BY department_id ORDER BY salary ROWS 1 PRECEDING)
windowing
FROM employees where department_id in (10,20,30)
ORDER BY department_id,salary ;
WINDOWING CLAUSE
WINDOWING CLAUSE BETWEEN 0 PRECEDING
AND 2 FOLLOWING

SELECT employee_id, department_id, salary,


SUM(salary) OVER ( PARTITION BY department_id
ORDER BY salary ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING ) windowing
FROM employees
WHERE department_id in (10,20,30)
ORDER BY department_id,salary ;
WINDOWING CLAUSE
WINDOWING CLAUSE CURRENT ROW au lieu de
0 PRECEDING
SELECT employee_id, department_id, salary,
SUM(salary) over ( PARTITION BY department_id
ORDER BY salary ROWS BETWEEN CURRENT ROW PRECEDING AND 2 FOLLOWING ) windowing
FROM employees
WHERE department_id in (10,20,30)
ORDER BY department_id,salary ;
WINDOWING CLAUSE
WINDOWING CLAUSE BETWEEN 1 PRECEDING
AND 2 FOLLOWING

SELECT employee_id, department_id, salary,


SUM(salary) OVER (
PARTITION BY department_id ORDER BY salary ROWS BETWEEN 1 PRECEDING AND 2
FOLLOWING ) windowing
FROM employees
WHERE department_id in (10,20,30)
ORDER BY department_id,salary ;

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 ;

Les résultats sont les


mêmes pour les lignes
appartenant à la même
partition
WINDOWING CLAUSE RANGE au lieu de ROWS

SELECT employee_id, department_id, salary,


SUM(salary) OVER ( PARTITION by department_id
ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED
FOLLOWING) windowing
FROM employees
WHERE department_id in (10,20,30)
ORDER BY department_id,salary ;
Même résultat, vu
l’utilisation de
UNBOUNDED
RANGE
WINDOWING CLAUSE Bornes spécifiées
lignes dont les valeurs de salaire se
situent dans la fourchette
SELECT employee_id, department_id, salary,
SUM(salary) OVER (
PARTITION BY department_id
ORDER BY salary RANGE BETWEEN 0 PRECEDING AND 100 FOLLOWING) windowing
FROM employees
WHERE department_id in (10,20,30)
ORDER BY department_id,salary ;
fourchette : salaire - 0 à salaire
fourchette suivante : salaire à salaire + 100
WINDOWING CLAUSE
SELECT employee_id, department_id, salary,
SUM(salary) OVER (
PARTITION BY department_id
ORDER BY salary RANGE BETWEEN 100 PRECEDING AND 100 FOLLOWING) windowing
FROM employees
WHERE department_id in (10,20,30)
ORDER BY department_id,salary ;

fourchette : salaire – 100 à salaire


fourchette suivante : salaire à salaire + 100
FIRST_VALUE et LAST_VALUE

 FIRST_ VALUE(<column>) {RESPECT/IGNORE} NULLS OVER (<analytic_clause>)

 FIRST_VALUE renvoie la première valeur des partitions après avoir fait la clause order

by.

 LAST_VALUE similaire à FIRST_VALUE , sauf qu'elle renvoie la dernière valeur.

 { RESPECT | IGNORE } NULLS clause, spécifie la prise en compte ou non des valeurs

NULL dans les résultats.


FIRST_VALUE
SELECT employee_id, department_id, salary,
FIRST_VALUE(SALARY) IGNORE NULLS OVER (
PARTITION BY department_id ORDER BY salary) LOW_SAL
FROM employees

Salaire les plus bas du département


d’appartenance
FIRST_VALUE et LAST_VALUE Par défaut :
Curent ROW comme dernière
valeur de la partition.
SELECT employee_id, department_id, salary,
FIRST_VALUE(SALARY) IGNORE NULLS OVER (
PARTITION BY department_id ORDER BY salary) LOW_SAL,
LAST_VALUE(SALARY) IGNORE NULLS OVER (
PARTITION BY department_id ORDER BY salary) HIGH_SAL
FROM employees
ORDER BY department_id,salary ;
LAST_VALUE renvoie
résultat erroné
FIRST_VALUE et LAST_VALUE Pour fixer les résultats erronés :
RANGE BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
SELECT employee_id, department_id, salary,
FIRST_VALUE(SALARY) IGNORE NULLS OVER (
PARTITION BY department_id ORDER BY salary) LOW_SAL,
LAST_VALUE(SALARY) IGNORE NULLS OVER (
PARTITION BY department_id ORDER BY salary
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) HIGH_SAL
FROM employees
ORDER BY department_id,salary ;
WINDOWING CLAUSE in Analytic FunctionsPour fixer les résultats erronés :
Simplement FIRST_VALUE au lieu de
SELECT employee_id, department_id, salary, LAST_VALUE avec DESC
FIRST_VALUE(SALARY) IGNORE NULLS OVER (
PARTITION BY department_id ORDER BY salary) LOW_SAL,
FIRST_VALUE(SALARY) IGNORE NULLS OVER (
PARTITION BY department_id ORDER BY salary DESC ) HIGH_SAL
FROM employees
ORDER BY department_id,salary ;
Analytic Functions
Liste des fonctions analytiques :
AVG * NTH_VALUE *
CORR * NTILE
COUNT * PERCENT_RANK
COVAR_POP * PERCENTILE_CONT
COVAR_SAMP * PERCENTILE_DISC
CUME_DIST RANK
DENSE_RANK RATIO_TO_REPORT
FIRST REGR_ (Linear Regression) Functions *
FIRST_VALUE * ROW_NUMBER
LAG STDDEV *
LAST STDDEV_POP *
LAST_VALUE * STDDEV_SAMP *
LEAD SUM *
LISTAGG VAR_POP *
MAX * VAR_SAMP *
MEDIAN VARIANCE *
MIN *

les fonctions suivies d'un astérisque (*) permettent la syntaxe complète, y compris la clause_fenêtre.

Analytic Functions (oracle.com)

Vous aimerez peut-être aussi