sql >> Database >  >> RDS >> Oracle

LEAD en LAG analytische functies

Hoofdfunctie in orakel

LEAD-functie in Oracle is een analytische functie die de mogelijkheid heeft om een ​​uitdrukking op de volgende rijen te berekenen (rijen die na de huidige rij komen) en de waarde terug te sturen naar de huidige rij . De algemene syntaxis van LEAD wordt hieronder weergegeven:

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

is de uitdrukking die moet worden berekend vanaf de eerste rij.
is de index van de eerste rij ten opzichte van de huidige rij en de standaardwaarde is 1
is de waarde die moet worden geretourneerd als de naar een rij buiten het partitiebereik wijst. Als u de standaardwaarde overslaat, retourneert de functie NULL.

Laten we een voorbeeld nemen om het gevoel te krijgen. Laten we eerst de voorbeeldgegevens voorbereiden

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;

Nu kunnen we de leadfunctie in Oracle gebruiken volgens onderstaande query

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

Andere standaardwaarde nemen

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

Als er geen standaardwaarden worden gegeven, geeft het null waar er geen waarde is. Dit wordt getoond in onderstaande zoekopdracht

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

LAG-functie in Oracle

Evenzo biedt LAG de techniek om op eerdere rijen te rekenen en de waarde terug te brengen naar de huidige rij

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

is de uitdrukking die moet worden berekend uit de vorige rij.
is de index van de vorige rij ten opzichte van de huidige rij en de standaardwaarde is 1
is de waarde die moet worden geretourneerd als de naar een rij buiten het partitiebereik wijst. Als u de standaardwaarde overslaat, retourneert de functie NULL.

Dezelfde dataset gebruiken als eerdere

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

Als er geen standaardwaarden worden gegeven, geeft het null waar er geen waarde is. Dit wordt getoond in onderstaande zoekopdracht

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

Ik hoop dat je dit artikel over de lead- en lag-functie in Oracle leuk vindt. Deze kunnen op veel gebieden erg nuttig zijn. Geef alsjeblieft de feedback

Gerelateerde artikelen
Oracle Interviewvragen
Analytische functies in Oracle
RANK-functie in Oracle
Dense_Rank-functie in Oracle
NULLIF-functie in Oracle
https://docs.oracle .com/en/database/oracle/oracle-database/12.2/sqlrf/LEAD.html#GUID-0A0481F1-E98F-4535-A739-FCCA8D1B5B77


  1. Zeer langzaam opstarten van Spring Boot-toepassing

  2. Hoe kleine letters naar hoofdletters te converteren in SQL Server - UPPER()

  3. Kolomgegevens retourneren van een gekoppelde server in SQL Server (T-SQL-voorbeelden)

  4. Hoe u uw MySQL- of MariaDB-database kunt beschermen tegen SQL-injectie:deel twee