• 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 "所有性别人数总和", --"所有性别人数总和" ,

  • 相关阅读:
    样式
    读取网页图片(包含代理)
    C# 替换“换行符”写法
    Iframe中弹出消息问题
    程序list
    C#对象序列化
    软件工程——个人总结
    软件工程——团队作业4
    软件工程———团队答辩
    软件工程--团队作业三
  • 原文地址:https://www.cnblogs.com/fgjl/p/15525124.html
Copyright © 2020-2023  润新知