代理网站备案,怎么看一个网站有没有做百度推广,app免费制作自助工厂,做网站要给ftp密码吗转载#xff1a;https://cloud.tencent.com/developer/article/1513067
写过 Sql 的同学应该都知道 group by 是用来对数据进行分组的#xff0c;一般与聚合函数一起使用#xff0c;对分组后的数据进行聚合。虽然大家都在用#xff0c;但是有些同学还是不太清楚 group by …转载https://cloud.tencent.com/developer/article/1513067
写过 Sql 的同学应该都知道 group by 是用来对数据进行分组的一般与聚合函数一起使用对分组后的数据进行聚合。虽然大家都在用但是有些同学还是不太清楚 group by 的底层到底是如何实现分组并且最后进行聚合的。今天就讲讲 group by 的底层实现。
我们直接来看例子下面有一张表 t,存储了不同日期对应的不同品类的销量具体数据如下 现在我们要统计2019年1月1到1月3期间没每个品类的总销量这个需求我们就可以用 group by 来实现实现代码如下
select cat ,sum(sales)
fromt
where sale_date between 2019/1/1 and 2019/1/3
group by cat上面代码中的 group by 具体执行过程是什么样子的呢我们看一下下面这这张图。 通过上图我们可以看出 group by 会对所有的数据先根据 cat 字段进行分组然后针对分组后的数据在组内进行聚合运算(计数、求和、求均值等)最后再将聚合后的每组数据进行汇总就得到了我们想要的结果。在上图中大家应该看到了分组模块只有 cat 这一列是标红加粗sale_date 和 sales 这两列是比较虚的字体为什么会这样呢难道我写错了其实不然是我故意的。为什么要故意呢我们看一下下面这张图 上图是将表 t 在 Excel 中做一个数据透视表如果我们只将 cat 这一列拖到行区域的时候在表中只显示出了 cat 这一列别的列是没有显示出来的Sql 中也是一样的道理所以我们只有 cat 列是标红加粗显示而其他列是虚的是因为其他列在这个阶段是没有显示出来不过他们也是随时待命的状态。
一旦你指明了要按照哪列数据进行聚合他们就会按照事先分好的组对要聚合的列去进行相应的聚合运算然后将结果进行汇总就是我们想要的数据了。
上面的是最简单的一个例子就是只按照 cat 这一列进行分组如果我们现在想要同时对 cat 和 sale_date 这两列来进行分组的话该怎么实现呢实现代码如下
selectcat,sale_date,sum(sales)
fromt
where sale_date between 2019/1/1 and 2019/1/3
group by cat,sale_date这个时候就相当于在透视表里面把 cat 和 sale_date 同时拖到了行区域但是也是只显示这两列而别的列是不显示的只有指明了聚合列的时候才会把聚合后的结果展示出来。 单纯的分组聚合的原理大家应该都明白了不过这里有一个特别需要注意的点不知道大家有没有注意到就是除了聚合列以外select 后面要查询的列必须在 group by 的后面出现。为什么要这样呢通过上面的两个例子我们也看到了虽然一个数据表会有多列但是在 group by 的时候只会显示出来你 group by 的列而其他列是不显示出来的没有显示出来的列你在 select 的时候肯定是查询不到的。
源数据如下 按照c1, c2分组之后 因为第1行和第6行属于同一个分组因此只剩下5条记录