Funkcja leada w Oracle
Funkcja LEAD w Oracle to funkcja analityczna, która ma możliwość obliczenia wyrażenia w następnych wierszach (wiersze, które będą następować po bieżącym wierszu) i zwrócenia wartości do bieżącego wiersza . Ogólna składnia LEAD jest pokazana poniżej:
LEAD (<expr>, <offset>, <default>) OVER (<analytic_clause>)
Weźmy przykład, aby to poczuć. Najpierw przygotujmy przykładowe dane
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;
Teraz możemy użyć funkcji wiodącej w Oracle zgodnie z poniższym zapytaniem
SQL> SELECT deptno, empno, sal,LEAD(sal, 1, 0) OVER ( partition by deptno ORDER BY sal DESC NULLS LAST) NEXT_LOWER_SAL FROM emp;
Przyjmowanie innej wartości domyślnej
SELECT deptno, empno, sal,LEAD(sal, 1,100) OVER ( partition by deptno ORDER BY sal DESC NULLS LAST) NEXT_LOWER_SAL FROM emp;
Jeśli nie podaje żadnych wartości domyślnych, to daje null tam, gdzie nie ma wartości. Jest to pokazane w poniższym zapytaniu
SELECT deptno, empno, sal,LEAD(sal) OVER ( partition by deptno ORDER BY sal DESC NULLS LAST) NEXT_LOWER_SAL FROM emp;
Funkcja LAG w Oracle
Podobnie LAG zapewnia technikę obliczania na poprzednich wierszach i zwracania wartości do bieżącego wiersza
LAG (<expr>, <offset>, <default>) OVER (<analytic_clause>)
Przyjmowanie tego samego zestawu danych co wcześniej
SQL> SELECT deptno, empno, sal,LAG(sal, 1,0) OVER ( partition by deptno ORDER BY sal DESC NULLS LAST) LAST_HIGH_SAL FROM emp;
Jeśli nie podaje żadnych wartości domyślnych, to daje null tam, gdzie nie ma wartości. Jest to pokazane w poniższym zapytaniu
SQL> SELECT deptno, empno, sal,LAG(sal) OVER ( partition by deptno ORDER BY sal DESC NULLS LAST) LAST_HIGH_SAL FROM emp;
Mam nadzieję, że spodobał Ci się ten artykuł na temat funkcji Lead and Lag w Oracle. Mogą one być bardzo przydatne w wielu obszarach. Prosimy o przesłanie opinii
Powiązane artykuły
Pytania do wywiadu z Oracle
Funkcje analityczne w Oracle
Funkcja RANK w Oracle
Funkcja Dense_Rank w Oracle
Funkcja NULLIF w Oracle
https://docs.oracle .com/pl/database/oracle/oracle-database/12.2/sqlrf/LEAD.html#GUID-0A0481F1-E98F-4535-A739-FCCA8D1B5B77