分析函式——FIRST_VALUE()和LAST_VALUE()
FIRST_VALUE()和LAST_VALUE()字面意思已經很直觀了,取首尾記錄值。
例:查詢部門最早發生銷售記錄日期和最近發生的銷售記錄日期
SQL> select *from criss_sales order by dept_id,sale_date;
DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT
------- ----------- ---------- -----------
D01 2014/3/4 G00 700
D01 2014/4/8 G01 200
D01 2014/4/30 G03 800
D01 2014/5/4 G02 80
D01 2014/6/12 G01
D02 2014/3/6 G00 500
D02 2014/4/8 G02 100
D02 2014/4/27 G01 300
D02 2014/5/2 G03 900
SQL> select
2 dept_id
3 ,sale_date
4 ,goods_type
5 ,sale_cnt
6 ,first_value(sale_date) over (partition by dept_id order by sale_date) first_value
7 ,last_value(sale_date) over (partition by dept_id order by sale_date desc) last_value
8 from criss_sales;
DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT FIRST_VALUE LAST_VALUE
------- ----------- ---------- ----------- ----------- -----------
D01 2014/3/4 G00 700 2014/3/4 2014/3/4
D01 2014/4/8 G01 200 2014/3/4 2014/4/8
D01 2014/4/30 G03 800 2014/3/4 2014/4/30
D01 2014/5/4 G02 80 2014/3/4 2014/5/4
D01 2014/6/12 G01 2014/3/4 2014/6/12
D02 2014/3/6 G00 500 2014/3/6 2014/3/6
D02 2014/4/8 G02 100 2014/3/6 2014/4/8
D02 2014/4/27 G01 300 2014/3/6 2014/4/27
D02 2014/5/2 G03 900 2014/3/6 2014/5/2
看結果first_value()很直觀,不用多解釋
但是,last_value()值,部門D01不是應該為2014/6/12,部門D02不是應該為2014/5/2嗎?為什麼會每條記錄都不一樣?
可以這樣去理解:last_value()預設統計範圍是 rows between unbounded preceding and current row
驗證一下:
SQL> select
2 dept_id
3 ,sale_date
4 ,goods_type
5 ,sale_cnt
6 ,first_value(sale_date) over (partition by dept_id order by sale_date) first_value
7 ,last_value(sale_date) over (partition by dept_id order by sale_date desc) last_value
8 ,last_value(sale_date) over (partition by dept_id order by sale_date rows between unbounded preceding and unbounded following) last_value_all
9 from criss_sales;
DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT FIRST_VALUE LAST_VALUE LAST_VALUE_ALL
------- ----------- ---------- ----------- ----------- ----------- --------------
D01 2014/3/4 G00 700 2014/3/4 2014/3/4 2014/6/12
D01 2014/4/8 G01 200 2014/3/4 2014/4/8 2014/6/12
D01 2014/4/30 G03 800 2014/3/4 2014/4/30 2014/6/12
D01 2014/5/4 G02 80 2014/3/4 2014/5/4 2014/6/12
D01 2014/6/12 G01 2014/3/4 2014/6/12 2014/6/12
D02 2014/3/6 G00 500 2014/3/6 2014/3/6 2014/5/2
D02 2014/4/8 G02 100 2014/3/6 2014/4/8 2014/5/2
D02 2014/4/27 G01 300 2014/3/6 2014/4/27 2014/5/2
D02 2014/5/2 G03 900 2014/3/6 2014/5/2 2014/5/2
全統計的情況下得到的last_value()值,部門D01為2014/6/12,部門D02為2014/5/2
例:查詢部門最早發生銷售記錄日期和最近發生的銷售記錄日期
SQL> select *from criss_sales order by dept_id,sale_date;
DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT
------- ----------- ---------- -----------
D01 2014/3/4 G00 700
D01 2014/4/8 G01 200
D01 2014/4/30 G03 800
D01 2014/5/4 G02 80
D01 2014/6/12 G01
D02 2014/3/6 G00 500
D02 2014/4/8 G02 100
D02 2014/4/27 G01 300
D02 2014/5/2 G03 900
SQL> select
2 dept_id
3 ,sale_date
4 ,goods_type
5 ,sale_cnt
6 ,first_value(sale_date) over (partition by dept_id order by sale_date) first_value
7 ,last_value(sale_date) over (partition by dept_id order by sale_date desc) last_value
8 from criss_sales;
DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT FIRST_VALUE LAST_VALUE
------- ----------- ---------- ----------- ----------- -----------
D01 2014/3/4 G00 700 2014/3/4 2014/3/4
D01 2014/4/8 G01 200 2014/3/4 2014/4/8
D01 2014/4/30 G03 800 2014/3/4 2014/4/30
D01 2014/5/4 G02 80 2014/3/4 2014/5/4
D01 2014/6/12 G01 2014/3/4 2014/6/12
D02 2014/3/6 G00 500 2014/3/6 2014/3/6
D02 2014/4/8 G02 100 2014/3/6 2014/4/8
D02 2014/4/27 G01 300 2014/3/6 2014/4/27
D02 2014/5/2 G03 900 2014/3/6 2014/5/2
看結果first_value()很直觀,不用多解釋
但是,last_value()值,部門D01不是應該為2014/6/12,部門D02不是應該為2014/5/2嗎?為什麼會每條記錄都不一樣?
可以這樣去理解:last_value()預設統計範圍是 rows between unbounded preceding and current row
驗證一下:
SQL> select
2 dept_id
3 ,sale_date
4 ,goods_type
5 ,sale_cnt
6 ,first_value(sale_date) over (partition by dept_id order by sale_date) first_value
7 ,last_value(sale_date) over (partition by dept_id order by sale_date desc) last_value
8 ,last_value(sale_date) over (partition by dept_id order by sale_date rows between unbounded preceding and unbounded following) last_value_all
9 from criss_sales;
DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT FIRST_VALUE LAST_VALUE LAST_VALUE_ALL
------- ----------- ---------- ----------- ----------- ----------- --------------
D01 2014/3/4 G00 700 2014/3/4 2014/3/4 2014/6/12
D01 2014/4/8 G01 200 2014/3/4 2014/4/8 2014/6/12
D01 2014/4/30 G03 800 2014/3/4 2014/4/30 2014/6/12
D01 2014/5/4 G02 80 2014/3/4 2014/5/4 2014/6/12
D01 2014/6/12 G01 2014/3/4 2014/6/12 2014/6/12
D02 2014/3/6 G00 500 2014/3/6 2014/3/6 2014/5/2
D02 2014/4/8 G02 100 2014/3/6 2014/4/8 2014/5/2
D02 2014/4/27 G01 300 2014/3/6 2014/4/27 2014/5/2
D02 2014/5/2 G03 900 2014/3/6 2014/5/2 2014/5/2
全統計的情況下得到的last_value()值,部門D01為2014/6/12,部門D02為2014/5/2
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28929558/viewspace-1181376/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle分析函式-first_value()和last_value()Oracle函式AST
- 【Analytic】分析函式之FIRST_VALUE函式函式
- 【Analytic】分析函式之LAST_VALUE函式函式AST
- [轉]分析函式 last_value的使用函式AST
- 【分析函式】Oracle分析函式之LAG和LEAD函式Oracle
- ORALCE函式:LAG()和LEAD() 分析函式詳解函式
- Oracle分析函式七——分析函式案例Oracle函式
- 分析函式DENSE_RANK 和 RANK函式
- 分析函式 - CUBE和GROUPING SETS函式
- 分析函式 - ROLLUP和GROUPING SETS函式
- sum()over()和count()over()分析函式函式
- Oracle聚合函式/分析函式Oracle函式
- 分析函式函式
- Python函式用法和底層分析Python函式
- 分析函式概述函式
- 分析函式 over函式
- Oracle 分析函式Oracle函式
- 分析函式 - LAG函式
- Oracle分析函式Oracle函式
- Oracle分析函式與視窗函式Oracle函式
- 【Analytic】分析函式之MIN函式函式
- 【Analytic】分析函式之MAX函式函式
- 【Analytic】分析函式之AVG函式函式
- 【Analytic】分析函式之RANK函式函式
- 【Analytic】分析函式之COUNT函式函式
- Excel資料分析入門-函式和公式Excel函式公式
- 字元函式、數字函式和日期函式字元函式
- oracle 10g函式大全--分析函式Oracle 10g函式
- sql優化用group by 函式代替分析函式SQL優化函式
- Hive之分析函式Hive函式
- 分析函式——NTILE(n)函式
- 分析函式——統計函式
- oracle 分析函式(轉)Oracle函式
- oracle分析函式(一)Oracle函式
- Oracle常用分析函式Oracle函式
- Oracle分析函式{轉}Oracle函式
- 多維分析函式函式
- Oracle分析函式-6Oracle函式