Oracle
 sql >> база данни >  >> RDS >> Oracle

LEAD и LAG аналитични функции

Водеща функция в оракул

Функция LEAD в Oracle е аналитична функция, която има способността да изчислява израз на следващите редове (редове, които ще дойдат след текущия ред) и да връща стойността на текущия ред . Общият синтаксис на LEAD е показан по-долу:

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

е изразът за изчисляване от водещия ред.
е индексът на водещия ред спрямо текущия ред и неговата стойност по подразбиране е 1
е стойността за връщане ако сочи към ред извън обхвата на дяловете. Ако пропуснете по подразбиране, тогава функцията ще върне NULL.

Нека вземем пример, за да го усетим. Първо нека подготвим примерните данни

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;

Сега можем да използваме функцията Lead в Oracle според заявката по-долу

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

Приемане на различна стойност по подразбиране

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

Ако не дадете стойности по подразбиране, тогава той дава null, където няма стойност. Това е показано в заявката по-долу

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

LAG функция в Oracle

По същия начин LAG предоставя техниката за изчисляване на предишни редове и връщане на стойността към текущия ред

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

е изразът за изчисляване от предишния ред.
е индексът на предишния ред спрямо текущия ред и неговата стойност по подразбиране е 1
е стойността за връщане ако сочи към ред извън обхвата на дяловете. Ако пропуснете по подразбиране, тогава функцията ще върне NULL.

Вземане на същия набор от данни като по-рано

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

Ако не дадете стойности по подразбиране, тогава той дава null, където няма стойност. Това е показано в заявката по-долу

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

Надявам се да ви хареса тази статия за функцията Lead and Lag в Oracle. Те могат да бъдат много полезни в много области. Моля, предоставете обратната връзка

Сродни статии
Въпроси за интервю за Oracle
Аналитични функции в oracle
функция RANK в Oracle
функция Dense_Rank в Oracle
функция NULLIF в Oracle
https://docs.oracle .com/en/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. как да изберете списък с 10 000 уникални идентификатори от двойни в oracle SQL

  2. Защо изборът на определени колони и всичко това е грешно в Oracle SQL?

  3. Как да се справяме с колона на таблица, наречена с резервирана ключова дума за SQL?

  4. Преброяване на броя на поява на символ в Oracle SQL

  5. Изберете N-ти ред от таблица в Oracle