Oracle
 sql >> Database >  >> RDS >> Oracle

Funzioni analitiche LEAD e LAG

Funzione principale in Oracle

La funzione LEAD in Oracle è una funzione analitica che ha la capacità di calcolare un'espressione nelle righe successive (righe che verranno dopo la riga corrente) e restituire il valore alla riga corrente . La sintassi generale di LEAD è mostrata di seguito:

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

è l'espressione da calcolare dalla riga iniziale.
è l'indice della riga iniziale relativa alla riga corrente e il suo valore predefinito è 1
è il valore da restituire se punta a una riga al di fuori dell'intervallo della partizione. Se salti il ​​valore predefinito, la funzione restituirà NULL.

Facciamo un esempio per averne la sensazione. Per prima cosa prepariamo i dati di esempio

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;

Ora possiamo utilizzare la funzione Lead in Oracle come indicato di seguito

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

Prendendo un valore predefinito diverso

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

Se non fornisce alcun valore per impostazione predefinita, restituisce null dove non esiste alcun valore. Questo è mostrato nella query sottostante

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

Funzione LAG in Oracle

Allo stesso modo LAG fornisce la tecnica per calcolare sulle righe precedenti e restituire il valore alla riga corrente

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

è l'espressione da calcolare dalla riga precedente.
è l'indice della riga precedente rispetto alla riga corrente e il suo valore predefinito è 1
è il valore da restituire se punta a una riga al di fuori dell'intervallo della partizione. Se salti il ​​valore predefinito, la funzione restituirà NULL.

Prendendo lo stesso set di dati di prima

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

Se non fornisce alcun valore per impostazione predefinita, restituisce null dove non esiste alcun valore. Questo è mostrato nella query sottostante

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

Spero che questo articolo sulla funzione Lead e Lag in Oracle ti piaccia. Possono essere molto utili in molte aree. Si prega di fornire il feedback

Articoli correlati
Domande su Oracle Interview
Funzioni analitiche in Oracle
Funzione RANK in Oracle
Funzione Dense_Rank in Oracle
Funzione NULLIF in Oracle
https://docs.oracle .com/en/database/oracle/oracle-database/12.2/sqlrf/LEAD.html#GUID-0A0481F1-E98F-4535-A739-FCCA8D1B5B77