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

LEAD og LAG analytiske funktioner

Lead funktion i oracle

LEAD-funktion i Oracle er en analytisk funktion, som har evnen til at beregne et udtryk på de næste rækker (rækker, der kommer efter den aktuelle række) og returnere værdien til den aktuelle række . Den generelle syntaks for LEAD er vist nedenfor:

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

er det udtryk, der skal beregnes fra den forreste række.
er indekset for den forreste række i forhold til den aktuelle række, og dens standardværdi er 1
er den værdi, der skal returneres hvis peger på en række uden for partitionsområdet. Hvis du springer standarden over, vil funktionen returnere NULL.

Lad os tage et eksempel for at få fornemmelsen af ​​det. Lad os først forberede eksempeldataene

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 kan vi bruge Lead-funktionen i Oracle i henhold til nedenstående forespørgsel

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

Tager en anden standardværdi

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

Hvis du ikke giver nogen værdier for standard, så giver det null, hvor der ikke er nogen værdi. Dette er vist i nedenstående forespørgsel

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

LAG-funktion i Oracle

Tilsvarende giver LAG teknikken til at beregne tidligere rækker og returnere værdien til den aktuelle række

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

er det udtryk, der skal beregnes fra den forrige række.
er indekset for den forrige række i forhold til den aktuelle række, og dens standardværdi er 1
er den værdi, der skal returneres hvis peger på en række uden for partitionsområdet. Hvis du springer standarden over, vil funktionen returnere NULL.

Tager det samme datasæt som tidligere

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

Hvis du ikke giver nogen værdier for standard, så giver det null, hvor der ikke er nogen værdi. Dette er vist i nedenstående forespørgsel

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

Jeg håber, du kan lide denne artikel om Lead and Lag-funktion i Oracle. Disse kan være meget nyttige på mange områder. Giv venligst feedback

Relaterede artikler
Oracle Interview spørgsmål
Analytiske funktioner i Oracle
RANK funktion i Oracle
Dense_Rank funktion i Oracle
NULLIF funktion i Oracle
https://docs.oracle .com/da/database/oracle/oracle-database/12.2/sqlrf/LEAD.html#GUID-0A0481F1-E98F-4535-A739-FCCA8D1B5B77


  1. Brug variabel indstillet af psql-metakommando inde i DO-blokken

  2. Sådan håndterer du springsekunder i Oracle

  3. SQL-OPDATERING for begyndere

  4. Lav en mere avanceret model med bruger-, tråd- og indlægsstatusser