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

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 jitterunion all select 120,0,10union all select 30,.02,20union all select 30,.04,20union all select 30,0,50union all select 30,0,70

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

在这里插入图片描述

超标条件

ping>90,lostrate>0.01,jitter>30

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

方案一:得出汇总结果

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

with t as (select 100 ping,.0 lostrate,10 jitterunion all select 120,0,10union all select 30,.02,20union all select 30,.04,20union all select 30,0,50union 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 jitterunion all select 120,0,10union all select 30,.02,20union all select 30,.04,20union all select 30,0,50union 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 jitterunion all select 120,0,10union all select 30,.02,20union all select 30,.04,20union all select 30,0,50union 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.hqwc.cn/news/22823.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算——云计算关键技术

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 一.云计算关键技术 1.虚拟化技术 2.分布式数据存储技术 (1&…

Java正则表达式捕获组

捕获组是将多个字符视为一个单元的一种方法。 它们是通过将要分组的字符放在一组括号中来创建的。 例如,正则表达式(dog)创建包含字母d,o和g的单个组。 捕获组通过从左到右计算它们的左括号来编号。 在表达式((A)(B(C)))中,例如,…

taro-ui-vue3 的虚拟列表组件VirtualScroll

项目&#xff1a;taro3vue3 用法&#xff1a; <at-virtual-scrollbench"5":height"listHeight":items"fieldList":item-height"itemHeight" ><template #default"{ index, item }"><view :id"merchan…

浏览器视口

目录 css单位相对单位绝对单位 像素分类物理像素逻辑像素css像素 DPRPPI浏览器视口布局视口视觉视口理想视口 css单位 在css中我们会使用到许多单位&#xff0c;如px&#xff0c;em&#xff0c;rem&#xff0c;vw&#xff0c;vh等等 整体上&#xff0c;我们可以将它们分成两类…

windows下安装consul、springboot整合consul

Spring Cloud Consul通过自动配置和绑定到Spring Environment和其他Spring编程模型习语&#xff0c;为Spring Boot应用程序提供Consul集成。通过一些简单的注解&#xff0c;可以快速启用和配置应用程序内的常用模式&#xff0c;并使用Hashicorp的Consul构建大型分布式系统。提供…

Elasticsearch--查询(nested、join)

nested 嵌套类型 数据的某个值是json、object对象&#xff1b;不再是简单的数据类型&#xff0c;或者简单数据类型的数组&#xff1b;那么还用之前的查询方式就有问题了。因为ES在存储复杂类型的时候会把对象的复杂层次结果扁平化为一个键值对列表 。此时&#xff0c;需要用n…

MyBatis 中如何使用缓存

MyBatis 中如何使用缓存 MyBatis 是一个基于 Java 的持久层框架&#xff0c;它提供了多种方式来使用缓存&#xff0c;包括一级缓存和二级缓存。本文将介绍 MyBatis 中常见的缓存使用方式及其使用方法。 1. 一级缓存 MyBatis 中的一级缓存是指 SqlSession 的缓存&#xff0c;它…

2023机器人操作系统(ROS)暑期学校预热-线下时间/地点-(转发)

原文地址&#xff1a; https://mp.weixin.qq.com/s/McjBgCpecL6OMgpcrPyY_Q 中国机器人操作系统&#xff08;ROS&#xff09;暑期学校自2015年举办以来&#xff0c;被中国机器人业界和学界&#xff0c;以及ROS开源基金会誉为除了ROSCon之外规模最大、参与人数最多、最成功的RO…

【JAVA】与数字相关的类,Number Math 类

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言数据类型Number类介绍数据格式化实例 Math类介绍静态常量实例 前言 为了解决对数字、日期和系统设置进行处理的困难&#xff0c;如&#xff1a;一些数字&数学问题、随机…

React中 Real DOM 和 Virtual DOM 的区别?优缺点?

一、是什么 Real DOM&#xff0c;真实 DOM&#xff0c;意思为文档对象模型&#xff0c;是一个结构化文本的抽象&#xff0c;在页面渲染出的每一个结点都是一个真实 DOM 结构&#xff0c;如下&#xff1a; Virtual Dom&#xff0c;本质上是以 JavaScript 对象形式存在的对 DOM …

【Visual Studio】在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 编号内容1【Visual Studio】在 Windows 上使用 Visual Studio 构建 VTK2【Visual Studio】在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK3【VTK】VTK 显…

OpenCv色彩空间

目录 一、RGB 二、图像处理入门 三、色彩空间的转换 一、RGB 在表示图像时&#xff0c;有多种不同的颜色模型&#xff0c;但最常见的是红、绿、蓝(RGB) 模型RGB 模型是一种加法颜色模型&#xff0c;其中原色 (在RGB模型中&#xff0c;原色是红色 R、绿色 G 和蓝色 B)混合在…