LAG()和LEAD() 分析函數

Lag和Lead分析函數可以在同一次查詢中取出同一字段的前N行的數據(Lag)和後N行的數據(Lead)作爲獨立的列。

在實際應用當中,若要用到取今天和昨天的某字段差值時,Lag和Lead函數的應用就顯得尤爲重要。當然,這種操作可以用表的自連接實現,但是LAG和LEAD與left join、rightjoin等自連接相比,效率更高,SQL更簡潔。下面我就對這兩個函數做一個簡單的介紹。

函數語法如下:

lag(exp_str,offset,defval) over(partion by ..order by …)

lead(exp_str,offset,defval) over(partion by ..order by …)

其中exp_str是字段名

 Offset是偏移量,即是上1個或上N個的值,假設當前行在表中排在第5行,則offset 爲3,則表示我們所要找的數據行就是表中的第2行(即5-3=2)。

 Defval默認值,當兩個函數取上N/下N個值,當在表中從當前行位置向前數N行已經超出了表的範圍時,lag()函數將defval這個參數值作爲函數的返回值,若沒有指定默認值,則返回NULL,那麼在數學運算中,總要給一個默認值纔不會出錯。

link

first-簡單實現

先創建一個數據

SET  TBLPROPERTIES ('transactional'='true');
CREATE TABLE IF NOT EXISTS lag_lead(
    id BIGINT  
   ,province  STRING
   ,mounth   STRING 
   ,gdp INT  
)
COMMENT "lag_lead";

--select * from lag_lead ;

insert into lag_lead 
values (1,'浙江省','1月',10),
 (2,'浙江省','2月',12),
 (3,'浙江省','3月',15),
 (4,'浙江省','4月',18),
 (5,'浙江省','5月',20);

數據如下

id province mounth gdp
1 浙江省 1月 10
2 浙江省 2月 12
3 浙江省 3月 15
4 浙江省 4月 18
5 浙江省 5月 20
-- LAG
SELECT id,province,mounth,gdp,LAG(gdp)OVER(ORDER BY mounth) as last_dgp
FROM  lag_lead
;

-- lead
SELECT id,province,mounth,gdp,lead(gdp)OVER(ORDER BY mounth) as next_dgp
FROM  lag_lead
;

結果如下:
lag

id province mounth gdp last_dgp
1 浙江省 1月 10 \N
2 浙江省 2月 12 10
3 浙江省 3月 15 12
4 浙江省 4月 18 15
5 浙江省 5月 20 18

lead

id province mounth gdp next_dgp
1 浙江省 1月 10 12
2 浙江省 2月 12 15
3 浙江省 3月 15 18
4 浙江省 4月 18 20
5 浙江省 5月 20 \N
second–分區

按照省份分區

insert into lag_lead 
values (6,'山東省','1月',8),
 (7,'山東省','2月',12),
 (8,'山東省','3月',13),
 (9,'山東省','4月',17),
 (10,'山東省','5月',20);
SELECT id,province,mounth,gdp,LAG(gdp)OVER(PARTITION BY province ORDER BY mounth) as last_dgp,lead(gdp)OVER(PARTITION BY province ORDER BY mounth) as next_dgp
FROM  lag_lead
ORDER BY id ASC 
;

結果如下
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章