8-oracle_分析函数(二)

来源:这里教程网 时间:2026-03-03 13:06:23 作者:

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

相关推荐