over(partition by)函数

2019-04-14 18:21发布

以前在河北省电力公司接触过一个线上办电(线上办电即手机办电)业务,为一个省公司出一个报表,用到了这个函数。 具体业务是:看这个手机tt.fk_user_id 本月or本周,受理过了多少工单,运用这个函数可以做到。 因涉及机密报表截图不予大家展示,sql执行结果请自行脑补,脚本为:  Select substr(ps_org_no, 1, 5),         nvl((COUNT(DISTINCT 受理申请编号) - count(distinct fk_user_id) * 9),             0)    from (Select ps_org_no,                 app_no 受理申请编号,                 tt.fk_user_id,                 count(1) over(partition by tt.fk_user_id) 工单总数            from (Select b.app_no,                         substr(b.ps_org_no, 1, 7) ps_org_no,                         t.fk_user_id                    from zxx_20180103_101102@zs_link b,                         CXUSER.SY_V_tb_preapply     t                   Where b.app_no = t.appno                     and handle_time between to_date('20171001', 'yyyy-mm-dd') and                         to_date('20171101', 'yyyy-mm-dd')) tt)   Where 工单总数 >= 10   group by substr(ps_org_no, 1, 5); 不得不佩服SQL很强大 有以下常用用法。参考了作者ugulc的文章:http://www.cnblogs.com/lcngu/p/5335170.html        count() over(partition by ... order by ...):求分组后的总数。
  max() over(partition by ... order by ...):求分组后的最大值。
  min() over(partition by ... order by ...):求分组后的最小值。
  avg() over(partition by ... order by ...):求分组后的平均值。
  lag() over(partition by ... order by ...):取出前n行数据。  lead() over(partition by ... order by ...):取出后n行数据。   ratio_to_report() over(partition by ... order by ...):Ratio_to_report() 括号中就是分子,over() 括号中就是分母。   percent_rank() over(partition by ... order by ...):