1): Lead(),Lag()
其实这2个函数的作用非常好理解,Lead()就是取当前顺序的下一条记录,相对Lag()就是取当前顺序的上一行记录。
经常会有判断在一定条件下的两条记录之间的时间差、或者数值差这样的需求。
比如有一个员工号+部门+销售金额的表结构,现在求出每个部门的后一名与前一名的销售金额差,每个部门的第一个差异为0
select user_no,
dept_code,
sales_amt,
lag (sales_amt, 1 , sales_amt) over ( partition by dept_code order by sales_amt desc ) lag_amt, -- 上一条金额
lag (sales_amt, 1 , sales_amt) over ( partition by dept_code order by sales_amt desc ) - sales_amt diff_amt -- 差异金额
from t_sales;
lag(sales_amt, 1, sales_amt):第一个参数表示取的数(示例取的:sales_amt),第二个参数表示两条记录相隔的间距,1表示上下两条(第2行的lag_amt取第一行的sales_amt,第3条取第2行的sales_amt),2表示第1条和第3条记录,第三个参数表示第一行时找不到上面一条记录则显示的数(所以003用户的lag_amt显示的是自己金额6734)。
理解了lag()函数后对lead()函数的理解就容易了,就是第一条记录取第二条录的sales_amt信息,取后一条则取自己的sales_amt信息
2): sum() over(partition by)
此函数功能用于按分区求和,与group by不同的是,他可以带出一些非group by字段的信息,对于一些求占比的需求很方便。
比如我们需要计算每个员工的销售金额占部门总销售金额的比率
select user_no,
dept_code,
sales_amt,
sum (sales_amt) over ( partition by dept_code) dept_all_amt, -- 部门总金额
sales_amt / sum (sales_amt) over ( partition by dept_code) amt_rt -- 员工占部门金额比率
from t_sales;
sum(sales_amt) over(partition by dept_code):sum()表示求和的字段,partition by表示按什么分区求和汇总。
3): max() over(partition by), min() over(partition by)等都是按分区求最大值和最小值。各位可以按需求套用相关的分析函数。
更多技术文章请关注公众号:BLT328
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31535951/viewspace-2639174/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31535951/viewspace-2639174/