前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL使用变量实现部分分组聚合

MySQL使用变量实现部分分组聚合

作者头像
用户1148526
发布2022-05-07 12:48:21
6630
发布2022-05-07 12:48:21
举报
文章被收录于专栏:Hadoop数据仓库

  在实际应用中经常有这种需求,按照select的字段中的部分字段分组聚合,比如下面的例子:

代码语言:javascript
复制
create table t1 (a varchar(20),b varchar(20),c int);
insert into t1 values('a','123',1);
insert into t1 values('b','456',2);
insert into t1 values('a','789',3);
insert into t1 values('b','123',4);
commit;

要求按字段a分组求和,查询a,b和聚合值,并按a、b排序。在Oracle里可以使用分析函数,写法如下:

代码语言:javascript
复制
select a,b,sum(c) over (partition by a) sum_c from t1 order by a,b;

查询结果和执行计划如图1所示:

图1

在MySQL中可以用两种方式实现:

代码语言:javascript
复制
-- 写法一,使用内连接,两次扫表
select t1.a, t1.b, t2.sum_c
  from t1,
       (select a, sum(c) sum_c
          from t1
         group by a) t2
 where t1.a = t2.a
 order by t1.a , t1.b;

查询结果和执行计划如图2所示:

图2

代码语言:javascript
复制
-- 写法二,使用变量,内层与外层相反排序
select a, b, if(@a = a1, @c:=@c, @c:=sum_c) sum_c, @a:=a1
  from (select a, b, if(@a = a, @c:=@c + c, @c:=c) sum_c, @a:=a a1
        from t1, 
		     (select @a:='', @c:=0) t2
       order by a, b desc) t
 order by a , b;

查询结果和执行计划如图3所示:

图3

从执行计划看,使用变量的写法性能更好一些。 参考: mysql实现oracle分析函数功能 over

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档