Oracle
 sql >> Datenbank >  >> RDS >> Oracle

LEAD- und LAG-Analysefunktionen

Lead-Funktion in Oracle

LEAD-Funktion in Oracle ist eine analytische Funktion, die die Fähigkeit hat, einen Ausdruck für die nächsten Zeilen (Zeilen, die nach der aktuellen Zeile kommen werden) zu berechnen und den Wert an die aktuelle Zeile zurückzugeben . Die allgemeine Syntax von LEAD ist unten dargestellt:

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

ist der aus der führenden Zeile zu berechnende Ausdruck.
ist der Index der führenden Zeile relativ zur aktuellen Zeile und sein Standardwert ist 1
ist der zurückzugebende Wert wenn auf eine Zeile außerhalb des Partitionsbereichs zeigt. Wenn Sie den Standardwert überspringen, gibt die Funktion NULL zurück.

Nehmen wir ein Beispiel, um ein Gefühl dafür zu bekommen. Zuerst bereiten wir die Beispieldaten vor

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;

Jetzt können wir die Lead-Funktion in Oracle gemäß der folgenden Abfrage verwenden

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

Anderen Standardwert annehmen

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

Wenn Sie keine Werte für den Standardwert angeben, wird null ausgegeben, wenn kein Wert vorhanden ist. Dies wird in der folgenden Abfrage gezeigt

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

LAG-Funktion in Oracle

In ähnlicher Weise bietet LAG die Technik, um auf vorherigen Zeilen zu berechnen und den Wert in die aktuelle Zeile zurückzugeben

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

ist der aus der vorherigen Zeile zu berechnende Ausdruck.
ist der Index der vorherigen Zeile relativ zur aktuellen Zeile und sein Standardwert ist 1
ist der zurückzugebende Wert wenn auf eine Zeile außerhalb des Partitionsbereichs zeigt. Wenn Sie den Standardwert überspringen, gibt die Funktion NULL zurück.

Unter Verwendung des gleichen Datensatzes wie früher

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

Wenn Sie keine Werte für den Standardwert angeben, wird null ausgegeben, wenn kein Wert vorhanden ist. Dies wird in der folgenden Abfrage gezeigt

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

Ich hoffe, Ihnen gefällt dieser Artikel über die Lead- und Lag-Funktion in Oracle. Diese können in vielen Bereichen sehr nützlich sein. Bitte geben Sie Feedback

Verwandte Artikel
Oracle-Interviewfragen
Analysefunktionen in Oracle
RANK-Funktion in Oracle
Dense_Rank-Funktion in Oracle
NULLIF-Funktion in Oracle
https://docs.oracle .com/en/database/oracle/oracle-database/12.2/sqlrf/LEAD.html#GUID-0A0481F1-E98F-4535-A739-FCCA8D1B5B77