Sql 语句小课堂8:求特定字段平均值的问题

news2024/11/26 1:47:54

Sql 语句小课堂8:求特定字段平均值的问题

  • 问题来源
  • 初始数据
  • 超标条件
    • 方案一:得出汇总结果
    • 方案二:在原有数据上附加其结果
  • 小结

问题来源

最近老顾变得原来越咸鱼了,好久没去逛 CSDN 问答了,于是灵感枯竭,不知道该怎么水文章了。嘿嘿。

今天无意中又去逛了一圈,发现一个有点意思的小问题,那么就来分享一下吧 :https://ask.csdn.net/questions/7974639

sql语句问题
现在有三个字段 ping,lostrate,jitter,每个字段有个标准(ping>90,lostrate>0.01,jitter>30),超过这个标准就算超标了,表中有几条数据
要求当三个字段中的某一个超标的时候,算出其平均值,我写的sql语句如下:平均值为ping:110,lostrate:0.03,jitter:60

嗯,具体问题可以看看题主的原始内容。总之呢,就是提供了一些初始数据,然后给定了一些条件,想得出一个特定结果。不过由于题主的描述有点问题,不知道最终需求结果到底是个什么样,咱们就随便写写好了。

CSDN 文盲老顾的博客,https://blog.csdn.net/superwfei
老顾的个人社区,https://bbs.csdn.net/forums/bfba6c5031e64c13aa7c60eebe858a5f?category=10003&typeId=3364713

初始数据

	select 100 ping,.0 lostrate,10 jitter
	union all select 120,0,10
	union all select 30,.02,20
	union all select 30,.04,20
	union all select 30,0,50
	union all select 30,0,70

根据题主的截图,老顾模拟一下这个初始数据,几个 union 即可。

在这里插入图片描述

超标条件

ping>90,lostrate>0.01,jitter>30

看题主的意思是,任意一项数据符合上述三个条件之一,就算超标了,需要将超标的数据单独拿出来计算平均值。

方案一:得出汇总结果

所以,我们第一个方案,是直接得到汇总后的结果。

with t as (
	select 100 ping,.0 lostrate,10 jitter
	union all select 120,0,10
	union all select 30,.02,20
	union all select 30,.04,20
	union all select 30,0,50
	union all select 30,0,70
)
select count(0) 总数,sum(case when ping>90 then 1 else 0 end) [ping 超标数量]
	,avg(case when ping>90 then ping else null end) [ping 超标平均值]
	,sum(case when lostrate>0.01 then 1 else 0 end)
	,avg(case when lostrate>0.01 then lostrate else null end)
	,sum(case when jitter>30 then 1 else 0 end)
	,avg(case when jitter>30 then jitter else null end)
from t

在这里插入图片描述
在这里,使用 null 不参与计算的特性,来实现超标部分的求平均方法。

方案二:在原有数据上附加其结果

因为想保留原有数据,其他数据需要附加在原有数据之后

所以,我们先使用开窗函数计算一下各个数据超标与不超标的平均值结果好了。

with t as (
	select 100 ping,.0 lostrate,10 jitter
	union all select 120,0,10
	union all select 30,.02,20
	union all select 30,.04,20
	union all select 30,0,50
	union all select 30,0,70
)
select *
	,avg(ping) over(partition by (case when ping > 90 then 1 else 0 end)) 
	,avg(lostrate) over(partition by (case when lostrate > .01 then 1 else 0 end)) 
	,avg(jitter) over(partition by (case when jitter > 30 then 1 else 0 end)) 
from t

在这里插入图片描述
这里,老顾的开窗函数只用了 partition ,而没有使用 order ,这样的结果,就相当于每列数据单独 group 了一下,嘿嘿,偷懒的小窍门。

那么,现在的问题是,我们需要更加优化一下这个查询,非超标部分的平均值,我们就不计算了,其次,还要把超标的数量也列出来。

with t as (
	select 100 ping,.0 lostrate,10 jitter
	union all select 120,0,10
	union all select 30,.02,20
	union all select 30,.04,20
	union all select 30,0,50
	union all select 30,0,70
)
select *
	,(case when ping > 90 then count(0) over(partition by (case when ping > 90 then 1 else 0 end)) else null end)
	,(case when ping > 90 then avg(ping) over(partition by (case when ping > 90 then 1 else 0 end)) else null end)
	,(case when lostrate > .01 then count(0) over(partition by (case when lostrate > .01 then 1 else 0 end))  else null end)
	,(case when lostrate > .01 then avg(lostrate) over(partition by (case when lostrate > .01 then 1 else 0 end))  else null end)
	,(case when jitter > 30 then count(0) over(partition by (case when jitter > 30 then 1 else 0 end)) else null end)
	,(case when jitter > 30 then avg(jitter) over(partition by (case when jitter > 30 then 1 else 0 end)) else null end)
from t

直接用 case when 来设置条件,符合条件的,才进行汇总计算,就可以得到预定结果了

在这里插入图片描述
同样,这个结果想要变成方案一的汇总结果,也很方便,只要解这几个无名列给出列名,然后对这些列直接取 max 结果,就是汇总结果了。

因为不知道题主到底想要个什么结果,所以老顾就写了两个方案,应该总有一款适用于这个题主的需求。可惜老顾看到这个题目的时候,已经结题了,没办法提交老顾的答案了。

小结

今天在做这个题目的时候,群里又有小伙伴问,count 是否必须跟着 group 走。。。。

嗯。。。。这个小伙伴是在刷力扣的数据库题,看到很多题目里都有 count 和 group 了。

但实际上,count、max、min、sum、avg 这几个,统称为聚合函数,而聚合函数可以结合分组使用,也可以单独使用,更可以结合开窗函数使用。

比如,本文的第一个方案,就是聚合函数单独使用的情况,这种情况,相当于所有数据默认带了一个 group by (相同数据列),也就是 group by 的分组,只有一个分组,所有数据都在这个分组内罢了。

再比如,本文的第二个方案,就是聚合函数结合开窗函数的使用方式,同样没有group,而是使用开窗函数的 partition 分区来代替了 group 分组。

最后就是,一定要注意,当列的值为 null 的时候,这一行的数据,不参与该列的所有计算,包括但不限于聚合函数,数学运算之类的。利用好这个特性,其实很多工作反而变的简单起来。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

postgresql(二):pgsql导出数据

pgsql导出数据 1、概述2、导出数据2.1、导出所有库2.2、导出指定库2.3、导出指定表 3、总结 1、概述 大家好,我是欧阳方超,可以关注我的公众号“欧阳方超”,后续内容将在公众号首发。 今天介绍一下使用pg数据库的命令导出数据的操作。 2、导…

今天给大家分享几款好用的时间管理APP

在现代社会,时间是我们最宝贵的资源之一。有效地管理时间可以提高我们的工作和学习效率,从而实现更好的生活和工作质量。随着技术的不断发展,越来越多的时间管理APP涌现出来。今天,我想向大家分享几款好用的时间管理APP&#xff0…

没有有效的提示词(Prompt),要 Stable Diffusion 何用?

再好的prompt,不如有个简单的prompt工具。 本文推荐一个日本人写的prompt插件,我进行了汉化,并补充了3000多个提示词。只需要鼠标点点就可以了!!! 引子: 今天去看了看Stable Diffusion插件版本…

MobPush Android常见问题

配置了默认点击跳转界面,对所有通道都有效吗 只对MobPush、魅族、小米、华为、OPPO、VIVO通道有效,对FCM通道无效。 如何获取回调参数 进程存活的情况下,可在我们的回调监听中看到通知详情,可以根据回调参数进行处理。 详情请查…

阿里云ECS云服务器的云盘使用

在我阿里云控制台上,可以看到有额外的磁盘(2个实例,3个磁盘) 找到对应云服务实例,看到了云盘信息 状态显示的挂接点是:/dev/xvdb 进入服务器却无法找到,也无法挂载 执行命令:fdisk …

c# 实现条件编译

创建三个不同的项目配置,分别代表不同的平台,在 Visual Studio 中,可以通过右键单击项目,选择“属性”,然后在“生成”选项卡下配置不同的条件编译符号。 针对 Windows 平台:在“生成”选项卡的“条件编译…

iOS--编译

前言 iOS 开发中使用的是编译语言,所谓编译语言是在执行的时候,必须先通过编译器生成机器码,机器码可以直接在CPU上执行,所以执行效率较高。他是使用 Clang / LLVM 来编译的。LLVM是一个模块化和可重用的编译器和工具链技术的集合…

Tomcat之配置文件详解

Tomcat 目录 安装好 Tomcat 后,打开它的文件夹,可以看到以下目录 bin:存放各种启动、关闭和其它程序的脚本 conf:配置文件及相关数据文件存放的目录 lib:Tomcat 使用的库文件存放的目录,如存放 Servlet 规范的 API logs:默认日志文件存放…

centos 配置好网络后无法ping 通百度

问题: ping 自己配置的ip地址能够ping通,ping 连接的WiFi (可以上外网)地址也能ping通,但是ping www.baidu.com 却ping不同; 配置 处理方法: 我的虚拟机开通了三张网卡,150段…

更新NGINX域名证书文件

背景: 由于域名正式认证即将要到期,需要更新基于nginx的域名证书文件。 一、更新nginx域名证书文件 1、查看对应域名使用的正式文件名 # 查看使用的域名证书文件 # 我的环境配置https的nginx相关配置文件是:ierp_https.confcat /usr/loca…

Vue3+Vite+Pinia+Naive后台管理系统搭建之二:scss 的安装和使用

前言 如果对 vue3 的语法不熟悉的,可以移步 Vue3.0 基础入门,快速入门。 1. 安装依赖 yarn add sass -D // or npm install sass -D 2. 页面样式初始化 reset.scss /* 新建 src/assets/style/reset.scss */ /* 页面样式初始化 */ html, body, div, s…

前端Vue自定义水平步骤条组件

随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现…

edk2 security boot校验流程

edk2整体架构 关于安全校验的核心逻辑 Code\Edk2\MdeModulePkg\Universal\SecurityStubDxe\SecurityStub.c Status gBS->InstallMultipleProtocolInterfaces (&mSecurityArchProtocolHandle,&gEfiSecurity2ArchProtocolGuid,&mSecurity2Stub,&gEfiSecurit…

神经网络架构设计常见问题及解答

如果你是人工神经网络 (ANN) 的初学者,你可能会问一些问题。 比如要使用的隐藏层数量是多少? 每个隐藏层有多少个隐藏神经元? 使用隐藏层/神经元的目的是什么? 增加隐藏层/神经元的数量总是能带来更好的结果吗? 使用什…

JAVA_SE 银行存钱(控制台程序)

仓库地址:https://gitee.com/ThMyGitee/Bank.git CSDN的友友们,项目如果适合您的话,麻烦给个小小的Star,谢谢啦! JAVA_SE 银行存钱(控制台程序) 1.流程图 2.开发环境 JDK1.8 IDEA 2019.33.界面运行 模拟转账业务&…

复习V2+V3之——02 事件处理

事件处理 事件的基本使用 1.使用v-on:xxx 或者 xxx 绑定事件,其中xxx是事件名 一般来说用 xxx 这种方式多一点 2.事件的回调函数需要配置在 methods 对象中,最终会在 vm 上面 3.methods中配置的函数,不要用箭头函数!否则this…

python爬虫哪个库用的最多

目录 常用的python爬虫库有哪些 1. Requests: 2. BeautifulSoup: 3. Scrapy: 4. Selenium: 5. Scrapy-Redis: 哪个爬虫库用的最多 Scrapy示例代码 总结 常用的python爬虫库有哪些 Python拥有许多常用的爬虫库…

node版本控制工具nvm使用笔记

由于不同的项目所需要的node环境不同,所以在运行支持node 12或者node 16版本的项目时卸载安装不同版本的node非常麻烦,恰巧公司有一个热心的同事告诉我可以使用nvm来进行版本控制,我使用了之后发现确实好用,写一篇笔记记录一下。 …

每天晚上12点服务器关机,第二天6点自动唤醒

每天晚上12点服务器关机,第二天6点自动唤醒。 作用主要有4个: 1、防黑:上班时黑客很少攻击,容易被发现。下班了、睡了,是黑客攻击的主要时间段。晚上关机,就直接没法攻击了。 2、省电。 3、电脑开了一天…

三勾商城java多端+多店+新零售商城系统

三勾商城是开发友好的微信小程序商城,框架支持SAAS,支持发布 iOS Android 公众号 H5 各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)等多个平台,不可多得的二开神器, 为大中小企业提供极致的移动电子…