Oracle lag()與lead() 函數
一、簡介
lag與lead函數是跟位移量相關的兩個分析函數,通過這兩個函數可以在一次查詢中取出同一欄位的前N行的資料(lag)和後N行的資料(lead)作為獨立的列,從而更方便地進行進行資料過濾。這種操作可以代替表的自我聯結,並且LAG和LEAD有更高的效率。
over()表示 lag()與lead()操作的資料都在over()的範圍內,他裡面可以使用partition by 語句(用於分組) order by 語句(用於排序)。partition by a order by b表示以a欄位進行分組,再 以b欄位進行排序,對資料進行查詢。
例如:lead(field, num, defaultvalue) field需要尋找的欄位,num往後尋找的num行的資料,defaultvalue沒有合格預設值。
二、樣本
1、表機構與初始化資料如下
-- 表結構
create table tb_test(
id varchar2(64) not null,
cphm varchar2(10) not null,
create_date date not null,
primary key (id)
)
-- 初始化資料
insert into tb_test values ('1000001', 'AB7477', to_date('2015-11-30 10:18:12','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000002', 'AB7477', to_date('2015-11-30 10:22:12','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000003', 'AB7477', to_date('2015-11-30 10:28:12','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000004', 'AB7477', to_date('2015-11-30 10:29:12','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000005', 'AB7477', to_date('2015-11-30 10:39:13','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000006', 'AB7477', to_date('2015-11-30 10:45:12','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000007', 'AB7477', to_date('2015-11-30 10:56:12','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000008', 'AB7477', to_date('2015-11-30 10:57:12','YYYY-MM-DD HH24:mi:ss'));
-- ---------------------
insert into tb_test values ('1000009', 'AB3808', to_date('2015-11-30 11:00:12','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000010', 'AB3808', to_date('2015-11-30 11:10:13','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000011', 'AB3808', to_date('2015-11-30 11:15:12','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000012', 'AB3808', to_date('2015-11-30 11:26:12','YYYY-MM-DD HH24:mi:ss'));
insert into tb_test values ('1000013', 'AB3808', to_date('2015-11-30 11:30:12','YYYY-MM-DD HH24:mi:ss'));
表初始化資料為:
2、樣本
a、擷取目前記錄的id,以及下一條記錄的id