Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonctions analytiques LEAD et LAG

Fonction de prospect dans Oracle

La fonction LEAD dans Oracle est une fonction analytique qui a la capacité de calculer une expression sur les lignes suivantes (lignes qui vont venir après la ligne actuelle) et de renvoyer la valeur à la ligne actuelle . La syntaxe générale de LEAD est illustrée ci-dessous :

LEAD (<expr>, <offset>, <default>) OVER (<analytic_clause>)

est l'expression à calculer à partir de la ligne de tête.
est l'index de la ligne de tête par rapport à la ligne actuelle et sa valeur par défaut est 1
est la valeur à renvoyer si le pointe vers une ligne en dehors de la plage de partition. Si vous ignorez la valeur par défaut, la fonction renverra NULL.

Prenons un exemple pour se faire une idée. Commençons par préparer les données d'exemple

CREATE TABLE "DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13),
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
)

CREATE TABLE "EMP"
( "EMPNO" NUMBER(4,0),
"ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0),
CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO"),
CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
REFERENCES "DEPT" ("DEPTNO") ENABLE
);

SQL> desc emp
Name Null? Type
---- ----  -----
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)

SQL> desc dept
Name Null? Type
---- -----  ----
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)


insert into DEPT values(10, 'ACCOUNTING', 'NEW YORK');
insert into dept values(20, 'RESEARCH', 'DALLAS');
insert into dept values(30, 'RESEARCH', 'DELHI');
insert into dept values(40, 'RESEARCH', 'MUMBAI');
commit;

insert into emp values( 7839, 'Clark', 'MANAGER', 7839, to_date('9-6-2008','dd-mm-yyyy'), 28573, null, 10 );
insert into emp values( 7782, 'Clara', 'MANAGER', 7839, to_date('9-6-2008','dd-mm-yyyy'), 0, null, 10 );
insert into emp values( 7934, 'Blake', 'MANAGER', 7839, to_date('1-5-2007','dd-mm-yyyy'), 0, null, 10 );
insert into emp values( 7788, 'Scott', 'ANALYST', 7788, to_date('9-6-2012','dd-mm-yyyy'), 30000, null, 20 );
insert into emp values( 7902, 'Bill', 'ANALYST', 7832, to_date('9-6-2012','dd-mm-yyyy'), 30000, null, 20 );
insert into emp values( 7876, 'TPM', 'ANALYST', 7566, to_date('9-6-2017','dd-mm-yyyy'), 11000, null, 20 );
insert into emp values( 7369, 'TPM1', 'ANALYST', 7566, to_date('9-6-2017','dd-mm-yyyy'), 8000, null, 20 );

insert into emp values( 7698, 'A1', 'ANALYST', 7788, to_date('9-6-2017','dd-mm-yyyy'), 28500, null, 30 );
insert into emp values( 7499, 'A2', 'ANALYST', 7698, to_date('9-7-2017','dd-mm-yyyy'), 16000, null, 30 );
insert into emp values( 7844, 'A3', 'ANALYST', 7698, to_date('9-7-2017','dd-mm-yyyy'), 15000, null, 30 );
insert into emp values( 7654, 'A4', 'ANALYST', 7698, to_date('9-7-2017','dd-mm-yyyy'), 12500, null, 30 );
insert into emp values( 7521, 'A5', 'ANALYST', 7698, to_date('9-7-2017','dd-mm-yyyy'), 12500, null, 30 );
insert into emp values( 7900, 'A6', 'ANALYST', 77698, to_date('9-7-2017','dd-mm-yyyy'), 0, null, 30 );
commit;

Nous pouvons maintenant utiliser la fonction Lead dans Oracle selon la requête ci-dessous

SQL> SELECT deptno, empno, sal,LEAD(sal, 1, 0) OVER ( partition by deptno ORDER BY sal DESC NULLS LAST) NEXT_LOWER_SAL FROM emp;

Prendre une valeur par défaut différente

SELECT deptno, empno, sal,LEAD(sal, 1,100) OVER ( partition by deptno ORDER BY sal DESC NULLS LAST) NEXT_LOWER_SAL FROM emp;

Si vous ne donnez aucune valeur pour default, alors il donne null là où il n'y a pas de valeur. Ceci est montré dans la requête ci-dessous

SELECT deptno, empno, sal,LEAD(sal) OVER ( partition by deptno ORDER BY sal DESC NULLS LAST) NEXT_LOWER_SAL FROM emp;

Fonction LAG dans Oracle

De même, LAG fournit la technique pour calculer sur les lignes précédentes et renvoyer la valeur à la ligne actuelle

LAG (<expr>, <offset>, <default>) OVER (<analytic_clause>)

est l'expression à calculer à partir de la ligne précédente.
est l'index de la ligne précédente par rapport à la ligne actuelle et sa valeur par défaut est 1
est la valeur à renvoyer si le pointe vers une ligne en dehors de la plage de partition. Si vous ignorez la valeur par défaut, la fonction renverra NULL.

Prenant le même ensemble de données que précédemment

SQL> SELECT deptno, empno, sal,LAG(sal, 1,0) OVER ( partition by deptno ORDER BY sal DESC NULLS LAST) LAST_HIGH_SAL FROM emp;

Si vous ne donnez aucune valeur pour default, alors il donne null là où il n'y a pas de valeur. Ceci est montré dans la requête ci-dessous

SQL> SELECT deptno, empno, sal,LAG(sal) OVER ( partition by deptno ORDER BY sal DESC NULLS LAST) LAST_HIGH_SAL FROM emp;

J'espère que vous aimez cet article sur les fonctions Lead et Lag dans Oracle. Celles-ci peuvent être très utiles dans de nombreux domaines. Merci de nous faire part de vos commentaires

Articles connexes
Questions d'entretien Oracle
Fonctions analytiques dans Oracle
Fonction RANK dans Oracle
Fonction Dense_Rank dans Oracle
Fonction NULLIF dans Oracle
https://docs.oracle .com/en/database/oracle/oracle-database/12.2/sqlrf/LEAD.html#GUID-0A0481F1-E98F-4535-A739-FCCA8D1B5B77