关于group by的用法 原理

(转)SQL中group by详解

我和原博文作者一样,突然间不会用group by了(可能是一直都不会用),就找了一下详解,这篇文章讲的很形象,学习一波

看一下测试表test
在这里插入图片描述
对这个表写group by时,可能就会发生下面这样的怪事:

select name from test group by name  -- ok
select * from test group by name --error
select name,sum(number) from test group by name -- ok 
  • 1
  • 2
  • 3

行吧,接下来一步步的来看。

1. 单列group by

对 test表(表1)执行下面语句

select name from test group by name
  • 1

结果很明显,这是表2
在这里插入图片描述

为了能够更好的理解“group by”多个列“和”聚合函数“的应用,由表1到表2的过程中,增加一个虚构的中间表:虚拟表3。下面说说如何来思考上面SQL语句执行情况:

  1. from test:sql执行的第一步,找表,这个没啥变化;

  2. from test group by name:没有join 和 where 操作,就是group by了,这时候的过程就如下图所示了,找到name那一列,将具有相同name值的行,合并成同一行。比如nama = aa时,就将<1,aa,2>和<2,aa,3>这两行合并,其它字段(id,number)合并在一个单元格;
    在这里插入图片描述

  3. 接下来就对产生的虚拟表3进行select操作了,这时候就可以看出上面的几句select的问题出在哪了。

(1)直接 select name 是没问题的,因为group by 的字段就是name,每个单元格只有一个name,某闷忒;

(2)执行 select * 的话,就是从表3中选择,可是id 和 number 字段中的单元格里的内容有多个值,关系型数据库是不允许这样的,这样就无法形成严格的关系约束条件了,所以会报错;

那么,对于 id 和 number列咋办呢?聚合函数。

不知道大家有没有遇到过 aggregator blah blah 之类的报错,我用 group by 的时候就放过这个错,现在想来应该就是 后面用了 group by,却没对字段进行聚合,导致单元格里有多个值。

聚合函数,就是用来输入多个数据,输出一个数据的,如count(id), sum(number),每个聚合函数的输入就是每一个多数据的单元格。

因此,这里可以执行

select name,sum(number) from test group by name
  • 1

那么sum 函数就是对虚拟表3中,每个name对应的number单元格进行sum操作,就可以得到:
在这里插入图片描述

2. 对多列进行 group by

那要是group by 多个字段怎么理解呢, 比如还是在test 表中,group by name,number,此时我们可以将name 和 number 看成一个整体字段,将其作为一个整体来进行判断划分的。如图:
在这里插入图片描述
这里只有 <bb, 5>和<cc, 6>是 name 和 number 都相等的,所以将其进行合并,其余并不完全一样,所以没有进行分组合并。

此时执行以下语句

select name,sum(id) from test group by name,number
  • 1

就可以得到
在这里插入图片描述
Done,再次感谢原博文作者。笔芯

pandas中的groupby函数用于按照指定的列对数据集进行分组,并对每个分组进行特定的操作。groupby函数的基本语法为: ```python df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs) ``` 其中,by参数用于指定分组依据的列名或列名列表;axis参数用于指定分组的轴向,默认为0,表示按照行进行分组;level参数用于多层索引时指定分组的级别;as_index参数用于指定分组后的结果是否以分组列作为索引;sort参数用于指定分组后的结果是否按照分组列排序;group_keys参数用于指定是否在分组后的结果中保留分组键;squeeze参数用于指定是否在分组后的结果中压缩单一分组的维度。 groupby函数返回的是一个GroupBy对象,可以对该对象进行多种操作,例如聚合、过滤、变换等。常用的聚合函数包括sum、mean、count、max、min等。groupby函数的原理是先将数据按照行或列进行分组,然后对每个分组进行特定的操作,并将结果合并成一个新的数据集。在实现上,groupby函数使用了split-apply-combine的策略,即先将数据集拆分成多个小组,然后对每个小组进行操作,最后将结果合并成一个新的数据集。 需要注意的是,groupby函数并不会改变原始的数据集,而是返回一个新的数据集,因此在使用groupby函数时需要注意将结果保存到变量中。另外,groupby函数对于大型数据集的性能较低,因此在处理大型数据集时需要谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值