Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Funkcje analityczne LEAD i LAG

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>)

to wyrażenie do obliczenia na podstawie wiersza wiodącego.
to indeks wiersza wiodącego względem bieżącego wiersza, a jego wartość domyślna to 1
to wartość do zwrócenia jeśli wskazuje na wiersz poza zakresem partycji. Jeśli pominiesz wartość domyślną, funkcja zwróci NULL.

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>)

to wyrażenie do obliczenia z poprzedniego wiersza.
to indeks poprzedniego wiersza względem bieżącego wiersza, a jego domyślna wartość to 1
to wartość do zwrócenia jeśli wskazuje na wiersz poza zakresem partycji. Jeśli pominiesz wartość domyślną, funkcja zwróci NULL.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie zawierające sprzężenia zewnętrzne zachowuje się inaczej w Oracle 12c

  2. Zmień numer daty w Excelu na datę Oracle

  3. SYS_EXTRACT_UTC() Funkcja w Oracle

  4. oracle 11g i integracja hibernacji wiosny i jsf

  5. ORA - 00933 zamieszanie ze sprzężeniem wewnętrznym i as