8-oracle_分析函数(二)

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

猜你喜欢

转载自blog.csdn.net/u012667253/article/details/88765090