博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
得到每个分组里的最大最小记录 Mongo VS Mysql
阅读量:6871 次
发布时间:2019-06-26

本文共 2297 字,大约阅读时间需要 7 分钟。

统计每个分组里的最大最小记录

mongo实现

{     "_id" : "01001",     "city" : "AGAWAM",     "pop" : 15338,     "state" : "MA"}

完整json见:

需求

得到每个state拥有最多人口的城市和拥有最小人口的城市以及对应的人口数

db.zipcodes.aggregate(    {$group: {_id:{state:"$state",city:"$city"}, popPerCity:{$sum:"$pop"} } },    {$sort: {popPerCity:1} },    {$group: {        _id:"$_id.state",        biggestCity:{$last:"$_id.city"},        biggestPop: {$last:"$popPerCity"},        smallestCity: {$first:"$_id.city"},        smallestPop: {$first:"$popPerCity"}    }})

效果

{ "_id" : "DE", "biggestCity" : "NEWARK", "biggestPop" : 111674, "smallestCity" : "BETHEL", "smallestPop" : 108 }{ "_id" : "MS", "biggestCity" : "JACKSON", "biggestPop" : 204788, "smallestCity" : "CHUNKY", "smallestPop" : 79 }...

见:

Mysql实现

相比mongo的直观 就要绕很多了

方案一

# 需要设置一个较大值 默认的1024还不够用SET SESSION group_concat_max_len = 20480;select state, substring_index(group_concat(city order by pop ),",",1) smallestCity, min(pop),substring_index(group_concat(city order by pop ),",",-1) biggestCity,  max(pop) from  (select state, city, sum(pop) pop from zipcode group by state, city) a group by state ;

参考

方案二

# 每个state分组里面分别按pop升序、降序排序 人为分配一个序号 均取序号一就得到了该分组的起止记录select b.state, b.city smallestCity, b.pop smallestPop, c.city biggestCity, c.pop biggestPop from( select state,city,pop,@rank:=if(@current_state=state, @rank+1, 1) rank, @current_state:=state from(select state, city, sum(pop) pop from zipcode group by state, city) a,(select @current_state:=NULL, @rank:=NULL) varsorder by a.state,a.pop) b ,( select state,city,pop,@rank:=if(@current_state=state, @rank+1, 1) rank, @current_state:=state from(select state, city, sum(pop) pop from zipcode group by state, city) a,(select @current_state:=NULL, @rank:=NULL) varsorder by a.state,a.pop desc) cwhere b.state = c.state and b.rank = 1 and c.rank = 1

补充

建表语句

CREATE TABLE `zipcode` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `zipcode` varchar(10) NOT NULL,  `city` varchar(30) NOT NULL,  `pop` int(11) NOT NULL,  `state` varchar(5) NOT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `zipcode` (`zipcode`),  KEY `idx_state_city` (`state`,`city`)) ENGINE=InnoDB DEFAULT CHARSET=utf8

json ==> batch insert sql

jq -c '[._id, .city, .pop, .state]' zips.json | sed 's/\[\(.*\)\]$/\1/' | awk -F, '{print "insert into zipcode select null," $1"," $2","$3","$4";"}'

转载地址:http://qqpfl.baihongyu.com/

你可能感兴趣的文章
Objective-C内存布局
查看>>
qsort的另类玩法,无聊写着耍耍
查看>>
每日一乐,健康多滋味~~
查看>>
[Oracle] - Connect to a PDB of Oracle12c
查看>>
VS2015 android 设计器不能可视化问题解决。
查看>>
移动数据统计平台分析
查看>>
httppp 1.4.0 发布,HTTP响应时间监控
查看>>
ASP.NET MVC加载ASCX之后,并为之赋值
查看>>
使用SDWebImage淡入淡出的方式加载图片
查看>>
nmon与nmonanalyser系统性能分析
查看>>
52. N-Queens II
查看>>
字符串匹配算法
查看>>
LAMP学习路线图
查看>>
MySQL入门(四)
查看>>
详解 ML2 Core Plugin(II) - 每天5分钟玩转 OpenStack(72)
查看>>
httpd-2.2 配置及用法完全攻略
查看>>
IntelliJ_编译一直报错“找不到符号”
查看>>
【Mongodb】3.X 配置身份验证
查看>>
云计算就像马拉松 京东CTO为啥这么说
查看>>
2017阿里UCAN大会,听听大咖们都讲了啥
查看>>