1. 程式人生 > >over(partition by)函式

over(partition by)函式

以前在河北省電力公司接觸過一個線上辦電(線上辦電即手機辦電)業務,為一個省公司出一個報表,用到了這個函式。

具體業務是:看這個手機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 
[email protected]
_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 ...):