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,%201,%20sales_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):%20sum()%20over(partition%20by)
此函数功能用于按分区求和,与group%20by不同的是,他可以带出一些非group%20by字段的信息,对于一些求占比的需求很方便。
比如我们需要计算每个员工的销售金额占部门总销售金额的比率
select %20user_no,
%20dept_code,
%20sales_amt,
%20 sum (sales_amt)%20 over ( partition %20 by %20dept_code)%20dept_all_amt,%20 -- 部门总金额
%20sales_amt%20/%20 sum (sales_amt)%20 over ( partition %20 by %20dept_code)%20amt_rt%20 -- 员工占部门金额比率
%20 from %20t_sales;
sum(sales_amt)%20over(partition%20by%20dept_code):sum()表示求和的字段,partition%20by表示按什么分区求和汇总。
3):%20max()%20over(partition%20by),%20min()%20over(partition%20by)等都是按分区求最大值和最小值。各位可以按需求套用相关的分析函数。
更多技术文章请关注公众号:BLT328
