Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Các chức năng phân tích LEAD và LAG

Chức năng dẫn đầu trong oracle

Hàm LEAD trong Oracle là một hàm Phân tích có khả năng tính toán một biểu thức trên các hàng tiếp theo (các hàng sẽ đến sau hàng hiện tại) và trả về giá trị cho hàng hiện tại . Cú pháp chung của LEAD được hiển thị bên dưới:

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

là biểu thức để tính toán từ hàng đầu.
là chỉ số của hàng đầu liên quan đến hàng hiện tại và giá trị mặc định của nó là 1
là giá trị trả về nếu trỏ đến một hàng bên ngoài phạm vi phân vùng. Nếu bạn bỏ qua mặc định, thì hàm sẽ trả về NULL.

Hãy lấy một ví dụ để hiểu về nó. Đầu tiên, hãy chuẩn bị dữ liệu mẫu

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;

Bây giờ chúng ta có thể sử dụng Hàm Lead trong Oracle theo truy vấn dưới đây

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

Lấy giá trị mặc định khác nhau

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

Nếu không cung cấp bất kỳ giá trị nào cho mặc định, thì nó sẽ cho giá trị null ở nơi không có giá trị nào. Điều này được hiển thị trong truy vấn dưới đây

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

Hàm LAG trong Oracle

Tương tự, LAG cung cấp kỹ thuật tính toán trên các hàng trước đó và trả về giá trị cho hàng hiện tại

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

là biểu thức để tính toán từ hàng trước.
là chỉ số của hàng trước đó so với hàng hiện tại và giá trị mặc định của nó là 1
là giá trị trả về nếu trỏ đến một hàng bên ngoài phạm vi phân vùng. Nếu bạn bỏ qua mặc định, thì hàm sẽ trả về NULL.

Lấy cùng một bộ dữ liệu làm earliar

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

Nếu không cung cấp bất kỳ giá trị nào cho mặc định, thì nó sẽ cho giá trị null ở nơi không có giá trị nào. Điều này được hiển thị trong truy vấn dưới đây

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

Tôi hy vọng bạn thích bài viết này về chức năng Dẫn và trễ trong Oracle, chúng có thể rất hữu ích trong nhiều lĩnh vực. Vui lòng cung cấp phản hồi

Các bài viết có liên quan
Câu hỏi phỏng vấn Oracle
Hàm phân tích trong oracle
Hàm RANK trong Oracle
Hàm Dense_Rank trong Oracle
Hàm NULLIF trong 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. Oracle có khái niệm chỉ mục được lọc không?

  2. Tại sao việc chọn các cột được chỉ định và tất cả đều sai trong Oracle SQL?

  3. 7 cách để kiểm tra phiên bản Oracle của bạn

  4. Cập nhật câu lệnh if truy vấn cho Oracle

  5. Java - Làm thế nào để gọi một thủ tục oracle với các kiểu tùy chỉnh?