MySQL怎么实现查询分位值
背景
分位值的概念
在统计学和数据分析中,分位数(或四分位数)经常用于描述数据分布的统计特征。一般情况下,分位值分成四个等份,分别为第一分位数(Q1)、第二分位数(Q2)(也就是中位数)、第三分位数(Q3)以及极差(IQR)。其中,1/4的数据小于第一分位数,1/4的数据大于第三分位数,中间50%的数据处于第一分位数和第三分位数之间。 在统计学中,第一分位数是指将一组数据按照大小顺序排列后,处于整个数列中最靠前的25%位置的数;第二分位数是指一组数据按大小顺序排列后,处于中间位置的那个数;而第三分位数是指将一组数据按照大小顺序排列后,处于整个数列中最靠后的25%位置的数。中位数是第二分位数。 在数据分析中,分位值可以帮助我们了解数据分布情况以及通过分位值来判断数据是否偏向一侧或者分散程度等问题。当数据分配不均匀的时候,分位值可以更准确的表现数据的差异。
业务背景
商家发放的优惠券的面额分布区间是[1, 20],每张优惠券都会被标记其对应的面额。要准确控制券的成本,必须实时了解券的发放情况,以便进行比较准确的评估。对券的发放量、发券金额均值、以及发放金额分位值(了解不同区间发放金额均值)进行实时的监控,就可以比较清楚的了解券的发放情况。
目前,业务梳理出如下指标需要数据的同学提供,所有指标均以分钟为统计粒度:
发放量:发券总量
发券金额均值:发放总额/发放总量
发券金额0.1分位均值:每分钟发券金额按照面额大小排序,面额大的在前,面额小的在后,计算每分钟发券金额靠前占比10%的那部分券的均值[如,发券面额排序为:10,9,8,8,6,5,4,4,2,2,那么0.1分位均值就是10]
发券金额0.2分位均值:每分钟发券金额按照面额大小排序,面额大的在前,面额小的在后,计算每分钟发券金额靠前占比20%的那部分券的均值[如,发券面额排序为:10,9,8,8,6,5,4,4,2,2,那么0.2分位均值就是(10+9)/2=9.5]
发放量和发券金额均值这类指标都可以用MySQL实现,那么如何实现使用MySQL查询分位值呢?
思考
MySQL实现排序
row_number() over ( partition by a1.min order by metric_value desc) as orderNum
metric_value表示发券金额,通过以上函数即可实现按照发券金额排序,而且是每分钟的发券数据按照金额排序
MySQL实现topN
SELECT * FROM sales ORDER BY amount DESC LIMIT 10;
很明显,这种topN方式并不能实现按分钟排序,取前N%。为了知道N%的数量,我们需要先确定总量,因此我们需要先计算每分钟的总量。然后再乘以N%,就知道我们需要提取N%有多少数据了。
select hour,min, count(1) as cn from table where dt=20230423 and hour=11 and min>=0 and min<=30 group by hour,min
然后,我们再把统计结果乘以N%
select dt,a2.hour,a2.min as min,metric_value, round(cn*N%) as cn, orderNum from ( select dt,hour,a1.min as min, metric_value, row_number() over ( partition by a1.min order by metric_value desc) as orderNum from table a1 where dt=20230423 and hour=11 and min>=0 and min<=30 ) as a2 inner join ( select hour,min , count(1) as cn from table c where dt=20230423 and hour=11 and min>=0 and min<=30 group by hour,min ) a3 on a2.hour=a3.hour and a2.min=a3.min
这样就可以通过比较cn(计算分位值所需要的数据量)和orderNum(当前券按面额大小排序所在顺序)的大小来获取得到前N%的数据,然后对这部分数据做avg处理,就能得到分位值数据。
调整计算逻辑融合到一起就可以得出分位值的SQL如下:
select dt,hour,min, round(avg(metric_value)) as metric_value from ( select dt,a2.hour,a2.min as min,metric_value, round(cn*?) as cn, orderNum from ( select dt,hour,a1.min as min, metric_value, row_number() over ( partition by a1.min order by metric_value desc) as orderNum from table a1 where dt=20230423 and hour=11 and min>=0 and min<=30 ) as a2 inner join ( select hour,min, count(1) as cn from table a1 where dt=20230423 and hour=11 and min>=0 and min<=30 ) as a3 on a2.hour=a3.hour and a2.min=a3.min ) as q where cn>orderNum group by dt,hour,min order by dt,hour,min
This data is within the range of calculating percentile value statistics if cn > orderNum.。为了计算0.1分位值,需要收集每分钟发券数据的前10%。按照面额排序,分钟分组后,每条记录都会标记这条记录排在第几。每分钟发券总量再乘以10%得到cnt,这个值就是计算这一分钟0.1分钟均值的所需要数据量,当cnt 说明 在使用MySQL实现计算分位值之前,分位值一直都是通过Java程序查询每分钟的发券数据,然后排序计算均值实现。通过程序实现最大的问题是,如果发券量比较大,那么要查询一段时间的分位值指标,这会对程序带来极大的压力。事实上,我们在实际的业务上也确实存在这个问题。每次查询2个小时的分位值数据,就会出现超百万的数据被加载到Java程序中,这对数据查询服务是极为可怕的。为了解决这个问题,我们必须通过MySQL的方式来实现分位值的查询。 由程序查询明细数据计算分位值 --> MySQL实现直接查询分位值 性能从>1min --> 15s以内;性能得到极大提升 以上是MySQL怎么实现查询分位值的详细内容。更多信息请关注PHP中文网其他相关文章!效果

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

可以通过以下步骤打开 phpMyAdmin:1. 登录网站控制面板;2. 找到并点击 phpMyAdmin 图标;3. 输入 MySQL 凭据;4. 点击 "登录"。

使用 Navicat Premium 创建数据库:连接到数据库服务器并输入连接参数。右键单击服务器并选择“创建数据库”。输入新数据库的名称和指定字符集和排序规则。连接到新数据库并在“对象浏览器”中创建表。右键单击表并选择“插入数据”来插入数据。

可在 Navicat 中通过以下步骤新建 MySQL 连接:打开应用程序并选择“新建连接”(Ctrl N)。选择“MySQL”作为连接类型。输入主机名/IP 地址、端口、用户名和密码。(可选)配置高级选项。保存连接并输入连接名称。

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

Redis 使用单线程架构,以提供高性能、简单性和一致性。它利用 I/O 多路复用、事件循环、非阻塞 I/O 和共享内存来提高并发性,但同时存在并发性受限、单点故障和不适合写密集型工作负载的局限性。

直接从数据库中恢复被删除的行通常是不可能的,除非有备份或事务回滚机制。关键点:事务回滚:在事务未提交前执行ROLLBACK可恢复数据。备份:定期备份数据库可用于快速恢复数据。数据库快照:可创建数据库只读副本,在数据误删后恢复数据。慎用DELETE语句:仔细检查条件,避免误删数据。使用WHERE子句:明确指定要删除的数据。使用测试环境:在执行DELETE操作前进行测试。
