阿里云maxcomputer(odps)与RDS中distinct,group by与having的使用

假设表为test,基本数据为a,b两列,均为数值型:

手动添加了以上数据:

基本语法:select a,sum(b) sum from test group by a having sum>5;

结果是:

解释为:通过a做分组,统计b的和,筛选出大于5的结果。

再简单一点呢??

select a from test group by a having sum(b)>5;

省略掉select部分的sum和命名操作,直接在having过程中使用函数,结果是省略了sum值,只保留了key,但结果是对的。

那么在省略一点,

select a from test having sum(b)>5;

这个结果可能就不是你想要的了,

再换换条件测试一下,

select a from test having sum(b)>1;

select a from test having sum(b)>25;

select a from test having sum(b)>26;

测试2个条件,发现在sum(b)>26的时候就或更大的时候数据为空,其他的时候都是1,

发现是因为全局的b的值做sum正好是26,那么结论就是在没有group by的作用下,sum等聚合函数是作用在全局的。

那么为什么不大于26的比较结果都是1呢,

这个是mysql的复写操作,没有group的前提下,使用聚合函数,不符合语法,默认添加了group by null这样就符合了语法

实际效果就是  limit 1;

那么久清楚了,select a from test having sum(b)>1;

复写为:select a from test group by null having sum(b)>1;

实际效果就是:select a from (select * from test limit 1) o where sum(b)>1;

sum(b)=26,大于1为真,就输出limit 1的结果,如果sum(b)>26为假,出差null;

========================================================================

再试试maxcomputer(odps),其实结果差不多,同样可以省略select中做聚合和别名操作,直接在having中进行,

但是,odps的语法要求必须有group by,select中key的字段必须在group中有体现,所以没有了group by null的操作。

如果没有,会语法报错,当然,可以用distinct代替group by,自己测试的结果是,在odps中distinct操作是直接被转成group by操作的。。。。

回过来有测试了rds的distinct发现是不可以,说明,rds的distinct并不是直接转成功group by这么。。。

rds中group by与distinct是有区别的,最直观的就是group by后可以在分组的数据内部做排序,筛选,distinct没有。。。

自己总结归纳,如有误解,请指教。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值