一条SQL实现数值占比计算,拒绝嵌套查询

一条SQL实现数值占比计算,拒绝嵌套查询

提示:在日常的工作项目中,会有需要获取数值占比计算的需求,我们改如何给他做到通用简洁化呢?
我们一般的项目中往往会选择再一次嵌套查询去计算占比值,但是如果我们的项目中需要进行配置、通用起来的情况下,会给我们造成很大的困扰。

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

提示:
为此,我考虑不以嵌套的形式,一条sql直接输出我们想要的数值占比,通过只需改变字段名称,就可直接获取占比值,一并返回,实现我们的高可用。

提示:以下是本篇文章正文内容,下面案例可供参考

一、开搞

支持多种数据库,oracle 、vertica ,因其中涉及窗口函数,mysql得在8.0以上的版本。

以下是mysql案例介绍。

  --只针对mysql8.0以上版本,其余数据库正常使用
  select id ,
       count(1)                   as count,
     concat(round(cast(count(1) /
                         last_value(count(1))
                         over (order by count(1) rows between unbounded PRECEDING AND unbounded FOLLOWING) as FLOAT) *
                    100, 2), '%') as radio
from user
where id in (1, 2, 3)
group by id 
with rollup;

解析:我以USER表为例,首先通过分组获取每组count的值,然后通过with rollup函数 获取 (总计),
在通过last_value() over()函数去获取最后一个总计的数值,最后就是一些计算百分比的函数进行返回

注:last_value 函数是对某个字段往下取值 over() 中 rows between unbounded PRECEDING AND unbounded FOLLOWING ;

说明:这是窗口函数,PRECEDING 意为 从第几个开始,FOLLOWING 偏移量是多少。
例 rows between 1 PRECEDING AND 2 FOLLOWING 从第一个值往下走两步,也是是第三列的值。
unbounded 是无界限的意思,
如果单是 unbounded PRECEDING 则就是取第一个值。联合起来也就是上的案例取最后一个值。

针对其他数据库,考虑with rollup替换。例 :vertica 替换为 rollup
    原文作者:FWWQS
    原文地址: https://blog.csdn.net/FWWQS/article/details/122983734
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞