1. 程式人生 > >Postgres中視窗函式lag以lead

Postgres中視窗函式lag以lead

sql中我們經常會用到聚合函式,聚合之後它會減少資料量,但是如果我們想把聚合之後的資料和原始資料同時展示出來,那麼我們需要用到視窗函式。

lag視窗函式通過條件把資料劃分成子類,在子類中進行排序

視窗函式的通用寫法

select name ,orderdate, cost, sum(cost) over(partition by extract(month from orderdate) order by orderdate)
from order1;

over():將聚合函式新增到查詢結果中
partition by:分成子類的條件
order by:將劃分子類之後的資料進行排序(一般只有排序之後串列埠函式lag才能發揮他的作用)

原始資料:
在這裡插入圖片描述

select name,orderdate,cost,
lag(orderdate,1,‘1900-01-01’) over(partition by name order by orderdate ) as time1,
lag(orderdate,2) over (partition by name order by orderdate) as time2

這是通過lag函式生成的兩個聚合欄位

lag中的引數

	orderdate:代表以orderdate進行分組,預設組內升序(降序desc)
	1:代表預設取上一個資料值(就是排序之後的上一個orderdate)
	'1900-01-01':因為組內起始值肯定是沒有前面的值的,也就是沒辦法取自己前面的值,預設為'1900-01-01',不寫則為null

聚合之後的結果:
聚合之後的結果:

至於Lead函式則與lag函式相反

lag取前面的值
lead則是取後面的值

相信大家看了之後還是不明白他有什麼用處,精髓就在於take以將聚合的資料和原始資料一同查詢出來。

舉個例子:
我們資料庫中有一張百萬級別的表,現在我們要查詢,但是,需要A資料中的m欄位於B資料中的欄位進行運算,又恰好你的資料是有一定的規律進行運算的,當然通過表的自關聯可以解決,但是對於一張資料量大的表來說,自關聯可想而知,效率極低。我們就可以利用視窗函式,在表中直接進行分組排序,運算了。

本次創作借鑑
可以檢視詳情
連結:關於視窗函式的其他用法