再來就是提供 200 多種的相關 SQL 語法。
參考 Mastering Oracle SQL and SQL Plus 的書籍,就有提到進階的 Oracle SQL 指令。
分析統計的指令 OVER 說明如下:
SELECT 統計函數(欄位) OVER (window spec) FROM table
其實可以把 OVER 當作同一個條件下的子查詢,並且有 Current Row 的概念。
整個 table 的資料在某些條件下篩選的資料就是 window,也就是我們所下 where 條件出來的資料。
統計函數就不多說明了,一般就是 SUM、AVERAGE、MIN、MAX…
windows-spec 指令的語法就是: partition by 欄位 + order by 欄位 + range-spec
1. partiton by:就是區分成多個區段做分析運算
2. order by:要先跟 Database 說依什麼方式的順序來計算,所以就要在此區段來定義
3. range-spec:要計算的資料範圍,下面會再做說明
範例要累加料件庫存的數量:
依料件不同各別累加,累加的順序為 img01,img02,img03,img04
select img01,img02,img03,img04,img10,sum(img10) over (partition by img01 order by img01,img02,img03,img04) from img_file
where img10 > 0
order by img01,img02,img03,img04
range-spec 說明:
RANGE + BETWEEN 開始 AND 結束
RANGE + UNBOUNDED PRECEDING
ROW + BETWEEN 開始 AND 結束
ROW + UNBOUNDED PRECEDING
BETWEEN…AND…:開始或結束,可以用 CURRENT ROW(目前)、PRECEDING(往前)、FOLLOWING(往後)
上面的範例再加上資料的範圍,結果會是相同的,依料件不同各別累加,累加的順序為 img01,img02,img03,img04
select img01,img02,img03,img04,img10,sum(img10) over (partition by img01 order by img01,img02,img03,img04 range unbounded preceding) from img_file
where img10 > 0
order by img01,img02,img03,img04
或是
select img01,img02,img03,img04,img10,sum(img10) over (partition by img01 order by img01,img02,img03,img04 row between unbounded preceding and current row) from img_file
where img10 > 0
order by img01,img02,img03,img04
select img01,img02,img03,img04,img10,sum(img10) over (partition by img01 order by img01,img02,img03,img04 range unbounded preceding) from img_file
where img10 > 0
order by img01,img02,img03,img04
或是
select img01,img02,img03,img04,img10,sum(img10) over (partition by img01 order by img01,img02,img03,img04 row between unbounded preceding and current row) from img_file
where img10 > 0
order by img01,img02,img03,img04
範例加總往前1筆到往後1筆的數量:
select img01,img02,img10,
sum(img10) over (partition by img01 order by img01,img02 rows between 1 preceding and 1 following)
from img_file
where img10 > 0
order by img01,img02
要注意,當用 BETWEEN…AND…超過 partition by 的運算範圍的時候,partition by 就不會有作用。
當然也可以做到是統計數字是往下累加(遞增)的,還是往上累加(遞減)的方式。
統計函數還有提供 LAG 上一筆、LEAD 下一筆,想要比較上一筆或下一筆的資料就可以做資料的判斷。
範例為帶出上一筆的庫存數量:
select img01,img02,img10,lag(img10) over (partition by img01 order by img01,img02)
from img_file
where img10 > 0
order by img01,img02
如果在 SQL 想要能夠抓取上一筆的欄位或是下一筆的欄位資料,也是可以用 OVER 的方式來達到。
統計函數還有提供 LAG 上一筆、LEAD 下一筆,想要比較上一筆或下一筆的資料就可以做資料的判斷。
範例為帶出上一筆的庫存數量:
select img01,img02,img10,lag(img10) over (partition by img01 order by img01,img02)
from img_file
where img10 > 0
order by img01,img02
如果在 SQL 想要能夠抓取上一筆的欄位或是下一筆的欄位資料,也是可以用 OVER 的方式來達到。