本文为博主原创,转载请注明出处:

  mysql使用group by可以使用一些聚合函数,可以计算最大值(max(column)),最小值(min(column)),总和(sum(column)),平均数(avg(column()))等等,

在使用聚合函数的函数的时候,我们只可以查询聚合函数相关的列,其余的列则不能进行查询。示例如下:

  表结构如下:

CREATE TABLE `fucdn_hot_rank_domain` (
`id` int(12) NOT NULL AUTO_INCREMENT COMMENT '主键',
`domain` int(11) NOT NULL COMMENT '域名id',
`band` double NOT NULL COMMENT '带宽,单位为B',
`total` int(16) NOT NULL COMMENT '请求数',
`clock` varchar(255) NOT NULL COMMENT '时间',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`,`clock`),
KEY `domain_id` (`domain`)
) ENGINE=InnoDB AUTO_INCREMENT=21961394 DEFAULT CHARSET=utf8 COMMENT='域名用量热门排行表';

  使用聚合函数查询非聚合列:

查询非聚合列的时候异常提示:

which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by,不在聚合函数之内,查询异常。

如果要查询非聚合函数的列,可以再嵌套一遍进行关联查询,

使用如下:

这种查询的方便之处在于它可以避免写多个sql进行多次查询,但如果需要查询的时候有多条,则需要手动过滤一下。项目中用到的sql如下:

select clock, band, total,domain from (
select MAX(band)as band1,domain from fucdn_hot_rank_domain
where domain
in(11612,11613,11614,11615,11616,11617,11618,11619,11620)
and clock BETWEEN '2019-10-20 00:00:00.0' and '2019-10-20 23:59:59.0' GROUP BY domain ORDER BY band1 desc limit 20
)t join fucdn_hot_rank_domain fhrd on t.band1=fhrd.band and t.domain= fhrd.domain ORDER BY domain

之前代码中要查询这些数据的时候是分批次查询的,先查询所有数据,再根据过滤出的所有域名,计算出对应的峰值以及峰值时间。

代码都是用的流式计算,由于数据量大,计算相对还是比较慢的,后来优化为上面的sql后,性能比之前快了两倍多。

原来实现的代码如下,以供警醒,哈哈

@Override
public List<HotRankDomainResult> getHotRankDomainList(DomainCodeHelper helper) throws FucdnException {
List<HotRankDomainResult> resultList = new ArrayList<>();
System.out.println("<<<<<<<<<<<<<<selectTime::"+new Date());
List<HotRankHelper> helperList = hotRankDao.getHotRankDomainList(helper);
System.out.println(">>>>>>>>>>>>>>selectEndTime::"+new Date()); // 计算出域名带宽峰值,峰值时间,总流量,总请求数等
// 1.获取域名列表
List<String> domainList = helperList.stream().map(HotRankHelper::getDomain).collect(Collectors.toList()); // 2.对域名列表去重
domainList = domainList.stream().distinct().collect(Collectors.toList());
for (String domain : domainList) {
HotRankDomainResult resultDetail = new HotRankDomainResult();
// 获取域名对应的列表数据
List<HotRankHelper> domainResultList = helperList.stream()
.filter((HotRankHelper flow) -> domain.equals(flow.getDomain())).collect(Collectors.toList());
// 计算峰值
domainResultList = domainResultList.stream().sorted(Comparator.comparing(HotRankHelper::getBand).reversed())
.collect(Collectors.toList()); // 计算总流量和请求数
double totalFlow = domainResultList.stream().collect(Collectors.summingDouble(HotRankHelper::getBand));
int totalRequest = domainResultList.stream().collect(Collectors.summingInt(HotRankHelper::getTotal));
// 获取峰值数据
HotRankHelper topHelper = domainResultList.get(0);
resultDetail.setMaxBand(topHelper.getBand());
resultDetail.setMaxBandTime(topHelper.getClock());
resultDetail.setDomain(topHelper.getDomain());
resultDetail.setTotalFlow(totalFlow);
resultDetail.setTotalRequest(Integer.toString(totalRequest));
resultList.add(resultDetail);
}
// 对集合进行排序:降序
resultList = resultList.stream().sorted(Comparator.comparing(HotRankDomainResult::getMaxBand).reversed())
.collect(Collectors.toList());
if (resultList.size() > 20) {
// 获取前20
resultList = resultList.subList(0, 20);
} System.out.println(">>>>>>>>>>>>>>sortEndTime::"+new Date());
return resultList;
}

mysql group by 查询非聚集列的更多相关文章

  1. PostgreSql之在group by查询下拼接列字符串

    首先创建group_concat聚集函数: CREATE AGGREGATE group_concat(anyelement) ( sfunc = array_append, -- 每行的操作函数,将 ...

  2. oracle中clob字段怎么查询非空列_20180517

    select * from uap_groupsynlogvo a where a.log_msg is not null ; 附加demo的建表脚本跟业务数据. 链接:https://pan.bai ...

  3. SQL Server 2014聚集列存储索引

    转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...

  4. SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 <第一篇>

    一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都 ...

  5. SQL查询优化:详解SQL Server非聚集索引(转载)

    本文是转载,原文地址 http://tech.it168.com/a2011/1228/1295/000001295176.shtml 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索 ...

  6. SQL Server 2014 聚集列存储

    SQL Server 自2012以来引入了列存储的概念,至今2016对列存储的支持已经是非常友好了.由于我这边线上环境主要是2014,所以本文是以2014为基础的SQL Server 的列存储的介绍. ...

  7. SQL Server 2016 —— 聚集列存储索引的功能增强

    作者 Jonathan Allen,译者         邵思华         发布于     2015年6月14日   聚集列存储索引(CC Index)是SQL Server 2014中两大最引 ...

  8. MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题

    排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题 By:授客 QQ:1033553122   测试环境 win10 MySQL 5.7 问题描述: 执行类似以下mysql查询, SEL ...

  9. 使用聚集索引和非聚集索引对MySQL分页查询的优化

    内容摘录来源:MSSQL123 ,lujun9972.github.io/blog/2018/03/13/如何编写bash-completion-script/ 一.先公布下结论: 1.如果分页排序字 ...

随机推荐

  1. java操作excel-----poi

    一.所需依赖包 1.使用maven会自动导入相关依赖,所以只需要导入2007版的的包,其他包自动导入,包括2003所需jar包. <dependency> <groupId>o ...

  2. 10 分钟上手 Vim,常用命令大盘点

    传闻有 180 万的程序员不知道如何退出 Vim 编辑器,真的有这么困难吗?下面给大家整理了一份 Vim 常用命令,让你 10 分钟快速上手 Vim,溜得飞起! 以下命令请在普通模式执行 1.移动光标 ...

  3. 项目Beta冲刺(团队)--4/7

    课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺 团队名称:葫芦娃队 作业目标:进行新一轮的项目冲刺,尽力完成并完善项目 团队博客 队员学号 队员昵称 博客地址 04160242 ...

  4. 修改linux环境变量导致系统命令不可用,-bash: xx: command not found

    QQ群里发现有群友对jmeter分布式环境搭建有困惑,于是决定写一篇. 首先我在安装好的linux虚拟机里面安装jdk,在修改环境变量(vim /etc/profile)后,导致系统命令不可用,-ba ...

  5. POJ2139-Six Degrees of Cowvin Bacon-(Floyd_Warshall)

    题意:有n只牛拍电影m部电影,知道每部电影有哪些牛参与,一起拍电影的牛之间维度为1,ab拍电影则ab之间的维度为1,如果bc一起拍电影,ac没有一起,则ac之间的维度为2,以此类推.求哪知牛到所有牛之 ...

  6. python的虚拟环境管理工具venv使用方法介绍及与nodejs的包管理方式对比

    一.nodejs 包管理方式 我们知道, nodejs的包管理工具npm可以安装项目所需要的包,安装方法及区别如下: npm i module_name -g 全局安装 npm i module_na ...

  7. Nginx+Php-fpm运行原理 代理与反向代理

    一.代理与反向代理 现实生活中的例子 1.正向代理:访问google.com 如上图,因为google被墙,我们需要vpnFQ才能访问google.com.Virtual Private Networ ...

  8. 关于C++中extern的简单笔记

    extern可以实现多文件共享同一个变量.const常量.函数. 下面结合几个例子来讲一下extern的相关性质(下述皆为多文件编译): 例1: //file1.cpp #include<ios ...

  9. X-factor Chain(信息学奥赛一本通 1628)

    题目描述 输入正整数 x,求 x 的大于 1 的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的序列的个数. 输入 多组数据,每组数据一行,包含一个正整数 x. 对于全部数据 ...

  10. [WEB安全]源码泄露总结

    原文链接:https://blog.csdn.net/qq_36869808/article/details/88895109 源码泄露总结: svn源码泄露:https://blog.csdn.ne ...