原创

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://wxy0327.blog.csdn.net/article/details/50708203
        在实际应用中经常有这种需求,按照select的字段中的部分字段分组聚合,比如下面的例子:
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里可以使用分析函数,写法如下:
select a,b,sum(c) over (partition by a) sum_c from t1 order by a,b;
        查询结果和执行计划如图1所示:
图1

        在MySQL中可以用两种方式实现:
-- 写法一,使用内连接,两次扫表
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

-- 写法二,使用变量,内层与外层相反排序
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 14:59:31
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览