Mysql区间分组查询的实现方式

 更新时间:2022年10月11日 15:17:15   作者:upupfeng  
这篇文章主要介绍了Mysql区间分组查询的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mysql区间分组查询

场景

一张用户表(user),有用户id(id)、余额(balance)等字段,要求展示 余额在某个区间内的人数

​ 区间有0-1万,1-10万,10-50万,50-100万,100万+,

下面是模拟数据:

用户id        余额
1            100    
2            200    
3            3223
4            100001
5            100025
6            512123
7            565656
8            10000001

统计结果应该如下所示:

余额          人数
0-1万        1
1-10万        2
10-50万        1
50-100万    2
100万+        1

第一想法

select 
    count(if(balance between 0 and 10000, id , null ) ) as "0-1万",
    count(if(balance between 10001 and 100000, id , null ) ) as "1-10万",
    count(if(balance between 100001 and 500000, id , null ) ) as "10-50万",
    count(if(balance between 500001 and 1000000, id , null ) ) as "50-100万",
    count(if(balance > 1000000, id , null ) ) as "100万+"
from user ;

这样可以查出来每个范围对应的人数,但是不尽人意,而且写的很麻烦…

一番百度之后

select interval(balance,0,10000,100000,500000,1000000) as i ,count(*) 
from user group by i;

select elt(interval(balance,0,10000,100000,500000,1000000),"0-1万","1-10万","10-50万","50-100万","100万+") as region ,count(*) 
from user group by region;

利用了mysql提供的interval和elt函数实现了效果

interval

interval(N,N1,N2,N3) ,比较列表中的N值,该函数如果N<N1返回0,如果N<N2返回1,如果N<N3返回2 等等。

elt

elt(n,str1,str2,str3,…) 如果n=1,则返回str1,如果n=2,则返回str2,依次类推

两个函数结合,再加上group,实现了这种范围分组的效果

另一种解决办法

由于使用的是类似mysql语句查询的一个分析数据库,它不支持elt函数和interval函数(抄mysql没有抄全…)

实现这种范围分组的场景,可以通过创建中间表的形式实现。然后通过用户表去join

创建如下一个中间表:有下限、上限和区间名三个字段

lower        upper        region
0            10000        0-1万
10001        100000        1-10万
100001        500000        10-50万
500001        1000000        50-100万
1000000        2000000000    100万+

用户表就可以通过余额字段去join这个表

select region,count(*)
from user 
left join tmp on user.balance between tmp.lower and tmp.upper
group by region 

就可以实现范围分组的效果

相比之前两种,感觉这个想法很有趣(同事教的)。

按区间分组查询、获取各区间的总数

数据表如下

需求

tick_count是次数、user_account是用户标识,user_account可能重复,统计0次,1-3次、4-6次、7-9次、10-12次、13次以上,这几个区间各有多少个用户数

select case
         when tc.stick_count = 0 then
          '0'
         when tc.stick_count > 0 and tc.stick_count <= 3 then
          '1to3'
         when tc.stick_count > 3 and tc.stick_count<= 6 then
          '4to6'
         when tc.stick_count > 6 and tc.stick_count <= 9 then
          '7to9'
	     when tc.stick_count > 9 and tc.stick_count <= 12 then
          '10to12'
	     when tc.stick_count >  13 then
          'more13'
       end stickLevel,
       COUNT(DISTINCT user_account) total
  from t_stick_detail_hourly tc 
 group by case
         when tc.stick_count = 0 then
          '0'
         when tc.stick_count > 0 and tc.stick_count <= 3 then
          '1to3'
         when tc.stick_count > 3 and tc.stick_count<= 6 then
          '4to6'
         when tc.stick_count > 6 and tc.stick_count <= 9 then
          '7to9'
		 when tc.stick_count > 9 and tc.stick_count <= 12 then
          '10to12'
	     when tc.stick_count > 13 then
          'more13'
       end

运行结果

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决MySQL启动常见错误:ERROR 2002(HY000) Can‘t connect to local MySQL server through socket‘tmp问题

    解决MySQL启动常见错误:ERROR 2002(HY000) Can‘t connect

    这篇文章主要介绍了解决MySQL启动常见错误:ERROR 2002(HY000) Can‘t connect to local MySQL server through socket‘tmp问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • mysql创建本地用户及赋予数据库权限的方法示例

    mysql创建本地用户及赋予数据库权限的方法示例

    这篇文章主要介绍了mysql创建本地用户及赋予数据库权限的相关资料,文中的介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • Ubuntu20下MySQL 8.0.28 安装卸载方法图文教程

    Ubuntu20下MySQL 8.0.28 安装卸载方法图文教程

    这篇文章主要为大家详细介绍了Ubuntu20下MySQL 8.0.28 安装卸载方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • MySQL多表操作的外键约束教程

    MySQL多表操作的外键约束教程

    MySQL多表之间的关系可以概括为:一对一、一对多/多对一关系,多对多,这篇文章主要介绍了MySQL多表操作的外键约束,需要的朋友可以参考下
    2023-01-01
  • MySQL因配置过大内存导致无法启动的解决方法

    MySQL因配置过大内存导致无法启动的解决方法

    这篇文章主要给大家介绍了关于MySQL因配置过大内存导致无法启动的解决方法,文中给出了详细的解决示例代码,对遇到这个问题的朋友们具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • MySQL查询树形结构数据的两种方法

    MySQL查询树形结构数据的两种方法

    本文主要介绍了MySQL查询树形结构数据的两种方法,可以使用递归查询或者闭包表来实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • mysql中的concat()函数模糊查询代替${}问题

    mysql中的concat()函数模糊查询代替${}问题

    这篇文章主要介绍了mysql中的concat()函数模糊查询代替${}问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Mysql时间轴数据 获取同一天数据的前三条

    Mysql时间轴数据 获取同一天数据的前三条

    这篇文章主要介绍了Mysql时间轴数据 获取同一天数据的前三条 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • mysql利用覆盖索引避免回表优化查询

    mysql利用覆盖索引避免回表优化查询

    这篇文章主要给大家介绍了关于mysql如何利用覆盖索引避免回表优化查询的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • MySQL复制的概述、安装、故障、技巧、工具(火丁分享)

    MySQL复制的概述、安装、故障、技巧、工具(火丁分享)

    首先主服务器把数据变化记录到主日志,然后从服务器通过I/O线程读取主服务器上的主日志,并且把它写入到从服务器的中继日志中,接着SQL线程读取中继日志,并且在从服务器上重放,从而实现MySQL复制。
    2011-04-04

最新评论