postgresql-sum() over()函數的試用


背景:最近在測試有關占比,有些算法使用笨辦法感覺很浪費時間,所以網上試着找了一個類似的函數來計算,提高效率。

前提描述:存在一張表:label_for_drug_insu_admdvs,其中drug_type為葯品分類:1,2,3,4分別代表西葯中成葯、中葯、自制葯、民族葯。drug_type為性別。

需要的結果:現在需要展示出各種性別類型的葯品分類金額及占比、總人數。其中每個性別的葯品占比=每個性別的葯品人數/所有性別總人數。具體實現效果見截圖

 

 sql實現方法:

SELECT
gend,
drug_type,
drug_psn_cnt,
SUM (drug_psn_cnt) OVER ( partition by gend order by drug_type) as "按性別的葯品分類連續求和" ,--"按性別的葯品分類連續求和",
sum(drug_psn_cnt) over (partition by gend) as "性別統計總和",-- 性別統計總和,同一性別總和不變。
--各葯品占所在性別占比
round(drug_psn_cnt/round( sum(drug_psn_cnt) over (partition by gend),4)*100,4)||'%' "各個葯品分類占比",
SUM (drug_psn_cnt) OVER () as "所有性別人數總和", --"所有性別人數總和" ,
round(drug_psn_cnt/round(SUM(drug_psn_cnt)OVER(),4)*100,4)||'%' "總份額" --總份額
FROM
drug_gend
WHERE
drug_type IN ('1', '2', '3', '4')
and admdvs LIKE '44%'

 

 

總結:sum() over()函數 ,over()不能單獨使用,要和sum()一起使用。

 over(partition by columnname1 order by columnname2)

含義,按columname1指定的字段進行分組排序,或者說按字段columnname1的值進行分組排序。

SUM (drug_psn_cnt) OVER ( partition by gend order by drug_type) as "按性別的葯品分類連續求和" ,--"按性別的葯品分類連續求和", 

sum(drug_psn_cnt) over (partition by gend) as "性別統計總和",-- 性別統計總和,同一性別總和不變。

SUM (drug_psn_cnt) OVER () as "所有性別人數總和", --"所有性別人數總和" ,

round(drug_psn_cnt/round( sum(drug_psn_cnt) over (partition by gend),4)*100,4)||'%' "各個葯品分類占比",

SUM (drug_psn_cnt) OVER () as "所有性別人數總和", --"所有性別人數總和" ,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM