sql >> データベース >  >> RDS >> Oracle

LEADおよびLAG分析関数

    Oracleのリード機能

    OracleのLEAD関数は、次の行(現在の行の後に続く行)で式を計算し、値を現在の行に返す機能を備えた分析関数です 。 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;

    これで、以下のクエリに従ってOracleのLead関数を使用できます

    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;

    OracleのLAG関数

    同様に、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;

    Oracleのリードおよびラグ関数に関するこの記事を気に入っていただければ幸いです。これらは多くの分野で非常に役立ちます。フィードバックを提供してください

    関連記事
    Oracleインタビューの質問
    Oracleの分析関数
    OracleのRANK関数
    OracleのDense_Rank関数
    OracleのNULLIF関数
    https://docs.oracle .com / en / database / oracle / oracle-database / 12.2 / sqlrf / LEAD.html#GUID-0A0481F1-E98F-4535-A739-FCCA8D1B5B77


    1. SQL内部結合–SQLとMySQLで3つのテーブルを結合する方法

    2. 1つのクエリで複数の行を挿入するMySQL

    3. OracleのNVL2機能

    4. MySQLで外部キーチェックを無効にする方法