sql >> Databáze >  >> RDS >> Oracle

Analytické funkce LEAD a LAG

Funkce vedení v oracle

Funkce LEAD v Oracle je analytická funkce, která má schopnost vypočítat výraz na dalších řádcích (řádky, které budou následovat po aktuálním řádku) a vrátit hodnotu do aktuálního řádku . Obecná syntaxe LEAD je uvedena níže:

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

je výraz, který se má vypočítat z úvodního řádku.
je index úvodního řádku vzhledem k aktuálnímu řádku a jeho výchozí hodnota je 1
je hodnota, která se má vrátit pokud ukazuje na řádek mimo rozsah oddílu. Pokud přeskočíte výchozí, funkce vrátí hodnotu NULL.

Vezměme si příklad, abyste to cítili. Nejprve si připravíme ukázková data

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;

Nyní můžeme použít funkci Lead Function v Oracle podle níže uvedeného dotazu

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

Použití jiné výchozí hodnoty

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

Pokud nezadáte žádné hodnoty pro výchozí, pak tam, kde není žádná hodnota, dává null. To je zobrazeno níže v dotazu

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

Funkce LAG v Oracle

Podobně LAG poskytuje techniku ​​pro výpočet na předchozích řádcích a vrácení hodnoty do aktuálního řádku

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

je výraz, který se má vypočítat z předchozího řádku.
je index předchozího řádku vzhledem k aktuálnímu řádku a jeho výchozí hodnota je 1
je hodnota, která se má vrátit pokud ukazuje na řádek mimo rozsah oddílu. Pokud přeskočíte výchozí, funkce vrátí hodnotu NULL.

Vezmeme stejnou datovou sadu jako dříve

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

Pokud nezadáte žádné hodnoty pro výchozí, pak tam, kde není žádná hodnota, dává null. To je zobrazeno níže v dotazu

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

Doufám, že se vám tento článek o funkci Lead and Lag v Oracle líbí. Mohou být velmi užitečné v mnoha oblastech. Uveďte prosím zpětnou vazbu

Související články
Otázky k rozhovoru s Oracle
Analytické funkce v oracle
Funkce RANK v Oracle
Funkce Dense_Rank v Oracle
Funkce NULLIF v Oracle
https://docs.oracle .com/en/database/oracle/oracle-database/12.2/sqlrf/LEAD.html#GUID-0A0481F1-E98F-4535-A739-FCCA8D1B5B77


  1. Jak číst a resetovat AUTO_INCREMENT v MySQL

  2. SQL pro generování seznamu čísel od 1 do 100

  3. Oracle vložit, pokud řádek neexistuje

  4. Instalace PostgreSQL na Ubuntu pro Ruby on Rails