ITPub博客

首页 > 数据库 > Oracle > 8-oracle_分析函数(二)

8-oracle_分析函数(二)

原创 Oracle 作者:blt32034 时间:2019-03-23 18:02:24 0 删除 编辑

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博客 ” ,链接:https://blog.itpub.net/31535951/viewspace-2639174/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
在快递和物流行业深耕多年,有丰富的行业经验和解决方案。

注册时间:2018-05-07

  • 博文量
    46
  • 访问量
    83821