ORACLE 偏移分析函數(shù) lag()與lead() 用法
一该面、簡介
lag與lead函數(shù)是跟偏移量相關(guān)的兩個分析函數(shù)殉了,通過這兩個函數(shù)可以在一次查詢中取出同一字段的前N行的數(shù)據(jù)(lag)和后N行的數(shù)據(jù)(lead)作為獨立的列,從而更方便地進行進行數(shù)據(jù)過濾顶考。這種操作可以代替表的自聯(lián)接,并且LAG和LEAD有更高的效率炬转。
over()表示 lag()與lead()操作的數(shù)據(jù)都在over()的范圍內(nèi)笙瑟,他里面可以使用partition by 語句(用于分組) order by 語句(用于排序)。partition by a order by b表示以a字段進行分組喷橙,再 以b字段進行排序啥么,對數(shù)據(jù)進行查詢。
例如:lead(field, num, defaultvalue) field需要查找的字段贰逾,num往后查找的num行的數(shù)據(jù)悬荣,defaultvalue沒有符合條件的默認值。
二疙剑、示例
表初始化數(shù)據(jù)為:
a氯迂、獲取當前記錄的id,以及下一條記錄的id
select t.id id , lead(t.id, 1, null) over (order by t.id) next_record_id, t.cphmfrom tb_test t order by t.id asc
b言缤、獲取當前記錄的id嚼蚀,以及上一條記錄的id
select t.id id , lag(t.id, 1, null) over (order by t.id) next_record_id, t.cphmfrom tb_test t order by t.id asc
c、獲取號牌號碼相同的管挟,當前記錄的id與驰坊,下一條記錄的id(使用partition by)
select t.id id, lead(t.id, 1, null) over(partition by cphm order by t.id) next_same_cphm_id, t.cphmfrom tb_test t order by t.id asc
學習題
編寫一個 SQL 查詢,查找所有至少連續(xù)出現(xiàn)三次的數(shù)字。
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
例如拳芙,給定上面的 Logs 表察藐, 1 是唯一連續(xù)出現(xiàn)至少三次的數(shù)字。
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
select distinct l1.Num as ConsecutiveNums
from Logs l1,Logs l2,Logs l3
where l1.Num=l2.Num and l2.Num=l3.Num and l1.id=l2.id-1 and l2.id=l3.id-1