場景:
一張使用者表(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值,該函式如果nelt
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
就可以實現範圍分組的效果
相比之前兩種,感覺這個想法很有趣(同事教的)。
打怪公升級!upup!
mysql區間查詢 MySQL區間分組查詢
假設a表為會員資訊表,需要統計男性會員年齡各階段的出現的人數 create table a id int 11 unsigned not null auto increment,name varchar 255 not null default comment 會員名稱 tinyint 1 unsi...
MySQL區間分組查詢
假設a表為會員資訊表,需要統計男性會員年齡各階段的出現的人數 create table a id int 11 unsigned not null auto increment,name varchar 255 not null default comment 會員名稱 tinyint 1 unsi...
mysql 分區間查詢 MySQL區間分組查詢
假設a表為會員資訊表,需要統計男性會員年齡各階段的出現的人數 create table a id int 11 unsigned not null auto increment,name varchar 255 not null default comment 會員名稱 tinyint 1 unsi...