sql >> Databasteknik >  >> RDS >> Oracle

LEAD och LAG analytiska funktioner

Lead-funktion i Oracle

LEAD-funktion i Oracle är en analytisk funktion som har förmågan att beräkna ett uttryck på nästa rader (rader som kommer att komma efter den aktuella raden) och returnera värdet till den aktuella raden . Den allmänna syntaxen för LEAD visas nedan:

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

är uttrycket som ska beräknas från den inledande raden.
är indexet för den inledande raden i förhållande till den aktuella raden och dess standardvärde är 1
är värdet som ska returneras om pekar på en rad utanför partitionsintervallet. Om du hoppar över standard kommer funktionen att returnera NULL.

Låt oss ta ett exempel för att få känslan av det. Låt oss först förbereda exempeldata

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 använda Lead-funktionen i Oracle enligt nedanstående fråga

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

Tar ett annat standardvärde

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

Om inte anger några värden för standard, så ger det null där det inte finns något värde. Detta visas i nedanstående fråga

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

På liknande sätt tillhandahåller LAG tekniken för att beräkna tidigare rader och returnera värdet till den aktuella raden

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

är uttrycket som ska beräknas från föregående rad.
är indexet för föregående rad relativt den aktuella raden och dess standardvärde är 1
är värdet som ska returneras om pekar på en rad utanför partitionsintervallet. Om du hoppar över standard kommer funktionen att returnera NULL.

Med samma datauppsättning som tidigare

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

Om inte anger några värden för standard, så ger det null där det inte finns något värde. Detta visas i nedanstående fråga

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

Jag hoppas att du gillar den här artikeln om Lead and Lag-funktion i Oracle. Dessa kan vara mycket användbara inom många områden. Lämna gärna feedbacken

Relaterade artiklar
Oracle-intervjufrågor
Analytiska funktioner i Oracle
RANK-funktion i Oracle
Dense_Rank-funktion i Oracle
NULLIF-funktion i Oracle
https://docs.oracle .com/en/database/oracle/oracle-database/12.2/sqlrf/LEAD.html#GUID-0A0481F1-E98F-4535-A739-FCCA8D1B5B77


  1. 5 sätt att kontrollera om en tabell finns i PostgreSQL

  2. SQL Server och Spectre/Meltdown Vulnerabilities

  3. SQL-server identitetskolumns värden börjar på 0 istället för 1

  4. Förstå PostgreSQL-datumtyper och funktioner (genom exempel)