How use LAG Oracle analytic function
Oracle 11g introduces the LAG() function, a powerful analytic tool that allows you to access data from previous rows without needing a self-join. The LAG() function retrieves data from a specific offset before the current row, making it ideal for tasks like comparing consecutive entries.

Very usefully new features in Oracle 11g is analytic Oracle SQL function LAG
.
Oracle LAG()
is an analytic function that allows you to access the row at a given offset before the current row without using a self-join.
The following illustrates the syntax of the LAG()
function:
LAG(expression [, offset ] [, default ]) OVER ( [ query_partition_clause ] order_by_clause )
SQL query LAG
This code find change in address post code in journal table:
SELECT * FROM ( SELECT t1.SITE_NUMBER ,t1.JN_DATETIME ,t1.ADR_POSTCODE ,LAG (t1.ADR_POSTCODE, 1) OVER (PARTITION BY t1.SITE_NUMBER ORDER BY t1.jn_datetime) AS PREV_ADR_POSTCODE FROM t1 ) WHERE adr_postcode = '00-001' AND PREV_ADR_POSTCODE <> '00-001' AND PREV_ADR_POSTCODE <> '00-000' ORDER BY SITE_NUMBER;
Test query data
CREATE TABLE T1 ( SITE_NUMBER VARCHAR2(16 BYTE), JN_DATETIME DATE, ADR_POSTCODE VARCHAR2(20 BYTE) ) LOGGING NOCOMPRESS MONITORING;" message="" highlight="" provider="manual"/][pastacode lang="sql" manual="SET DEFINE OFF; Insert into KPREISKORN.T1 (SITE_NUMBER, JN_DATETIME, ADR_POSTCODE) Values ('20001', TO_DATE('08/01/2017 15:01:31', 'MM/DD/YYYY HH24:MI:SS'), '00-001'); Insert into KPREISKORN.T1 (SITE_NUMBER, JN_DATETIME, ADR_POSTCODE) Values ('20002', TO_DATE('04/20/2017 11:59:29', 'MM/DD/YYYY HH24:MI:SS'), '00-002'); Insert into KPREISKORN.T1 (SITE_NUMBER, JN_DATETIME, ADR_POSTCODE) Values ('20001', TO_DATE('06/15/2017 04:02:41', 'MM/DD/YYYY HH24:MI:SS'), '00-003'); Insert into KPREISKORN.T1 (SITE_NUMBER, JN_DATETIME, ADR_POSTCODE) Values ('20004', TO_DATE('06/20/2017 20:15:13', 'MM/DD/YYYY HH24:MI:SS'), '00-001'); Insert into KPREISKORN.T1 (SITE_NUMBER, JN_DATETIME, ADR_POSTCODE) Values ('20001', TO_DATE('12/10/1929 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), '00-001'); Insert into KPREISKORN.T1 (SITE_NUMBER, JN_DATETIME, ADR_POSTCODE) Values ('20001', TO_DATE('09/25/2091 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), '00-003'); Insert into KPREISKORN.T1 (SITE_NUMBER, JN_DATETIME, ADR_POSTCODE) Values ('20001', TO_DATE('09/14/1914 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), '00-001'); Insert into KPREISKORN.T1 (SITE_NUMBER, JN_DATETIME, ADR_POSTCODE) Values ('20001', TO_DATE('03/25/1911 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), '00-001'); Insert into KPREISKORN.T1 (SITE_NUMBER, JN_DATETIME, ADR_POSTCODE) Values ('20001', TO_DATE('11/22/2029 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), '00-001'); COMMIT;
SQL result
site_number | jn_datetime | adr_postcode | prev_adr_postcode |
---|---|---|---|
20001 | 2017-08-01 15:01:31 | 00-001 | 00-003 |
How it works together
Run online these examples:
- http://sqlfiddle.com/#!4/e3f24c/1/0
- http://sqlfiddle.com/#!4/e3f24c/1/1
- https://livesql.oracle.com/apex/f?p=590:49::::RP,49:P49_SEARCH:lag
Karol PreiskornDecember 9th, 2017plsql, sql 0 comments on How use LAG Oracle analytic function446oracle, plsql, sql
Related Posts
Subscribe
Login
0 Comments
Newest
Oldest
Most Voted
Inline Feedbacks
View all comments