数据库的group by有啥意义呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库的group by有啥意义呢?相关的知识,希望对你有一定的参考价值。

数据库的group by有什么意义呢?(sql server)

数据库的group by意义是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。例如:SELECT COUNT(*) AS 水果种类 FROM Table GROUP BY ProductPlace

这个SQL语句就是使用了Group By + 分组字段的方式,那可以解释成“按照出产国家(ProductPlace)将数据集进行分组,然后分别按照各个组来统计各种水果的记录数量。”

扩展资料:

如果GROUP BY使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。

在结果集内返回每个可能的组和子组组合的 GROUP BY 汇总行。GROUP BY 汇总行可用来表示所有值,也可以在结果中显示为 NULL。

参考资料来源:

百度百科——GROUP BY

百度百科——聚合函数

参考技术A 是分组的意思

group by
分组
通用数据库具有基于表的特定列对数据进行分析的能力。
可按照在 GROUP BY 子句中定义的组对行进行分组。以其最简单的形式,组由称为分组列的列组成。 SELECT 子句中的列名必须为分组列或列函数。列函数对于 GROUP BY 子句定义的每个组各返回一个结果。下列示例产生一个列出每个部门编号的最高薪水的结果:
SELECT DEPT, MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT
此语句产生下列结果:
DEPT MAXIMUM
------ ---------
10 22959.20
15 20659.80
20 18357.50
38 18006.00
42 18352.80
51 21150.00
66 21000.00
84 19818.00
注意:计算的是每个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY)。
将 WHERE 子句与 GROUP BY 子句一起使用
分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句。例如:
SELECT WORKDEPT, EDLEVEL, MAX(SALARY) AS MAXIMUM
FROM EMPLOYEE
WHERE HIREDATE > '1979-01-01'
GROUP BY WORKDEPT, EDLEVEL
ORDER BY WORKDEPT, EDLEVEL

结果为:
WORKDEPT EDLEVEL MAXIMUM
-------- ------- -----------
D11 17 18270.00
D21 15 27380.00
D21 16 36170.00
D21 17 28760.00
E11 12 15340.00
E21 14 26150.00
注意:在 SELECT 语句中指定的每个列名也在 GROUP BY 子句中提到。未在这两个地方提到的列名将产生错误。GROUP BY 子句对 WORKDEPT 和 EDLEVEL 的每个唯一组合各返回一行。
在 GROUP BY 子句之后使用 HAVING 子句
可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。为此,在GROUP BY 子句后面包含一个 HAVING 子句。 HAVING 子句可包含一个或多个用 AND 和 OR 连接的谓词。每个谓词将组特性(如 AVG(SALARY))与下列之一进行比较:
该组的另一个特性
例如:
HAVING AVG(SALARY) > 2 * MIN(SALARY)
常数
例如:
HAVING AVG(SALARY) > 20000
例如,下列查询寻找雇员数超过 4 的部门的最高和最低薪水:
SELECT WORKDEPT, MAX(SALARY) AS MAXIMUM, MIN(SALARY) AS MINIMUM
FROM EMPLOYEE
GROUP BY WORKDEPT
HAVING COUNT(*) > 4
ORDER BY WORKDEPT
此语句产生下列结果:
WORKDEPT MAXIMUM MINIMUM
-------- ----------- -----------
D11 32250.00 18270.00
D21 36170.00 17250.00
E11 29750.00 15340.00
有可能(虽然很少见)查询有 HAVING 子句但没有 GROUP BY 子句。在此情况下,DB2 将整个表看作一个组。因为该表被看作是单个组,所以最多可以有一个结果行。如果 HAVING 条件对整个表为真,则返回选择的结果(该结果必须整个由列函数组成);否则不返回任何行。

官方讲是按组操作,

或者好理解点就是按类操作..

看个例子你就明白了,表如下:

ID 名称 仓库 数量
01 西瓜 一号 10
02 西瓜 二号 30
03 大米 一号 30
04 苹果 一号 40
05 苹果 二号 45
06 苹果 三号 5

Select name,Sun(price) From 表 Group By name

以上SQL将返回各种商品的总数量,而不管是哪个仓库的..

结果:

西瓜,40
大米,30
苹果,90本回答被提问者采纳
参考技术B

group by一般用于将查询结果分组,多配合聚合函数,sum,count,min,max等一起使用。

如表名test,数据如下

id     grade

1        10

1        50

2        30

2        40

3        20


如果按照id,求grade的和,则可以

select id,sum(grade) as grade from test group by id

结果就是

id     grade

1        60

2        70

3        20


注意:count,min,max函数等也是同样道理

但有时,group by也配合having使用,如上边的例子,如果要查询grade的和大于50的id及grade的和,就可以这样使用

select id,sum(grade) as grade from test group by id having sum(grade)>50

结果如下:

id     grade

1        60

2        70

参考技术C 分组,关键问题: 在有计算公式的SELECT语句中,没有参与计算的变量必须房在 GROUP BY 语句里 参考技术D 分组
select a.a,a.b from a group by a.a
按照a.a分组

Double Group-by 那么应用一些功能呢?

【中文标题】Double Group-by 那么应用一些功能呢?【英文标题】:Double Group-by then apply some functions? 【发布时间】:2016-11-30 13:50:05 【问题描述】:

我的数据如下所示:

 country    source
0   UK       Ads
1   US       Seo
2   US       Seo
3   China    Seo
4   US       Seo
5   US       Seo
6   China    Seo
7   US       Ads

对于每个国家,我想获得每个来源的比率。我对国家和来源进行了分组,得到了下表,其中包含每个国家/地区每个来源的总计数,但不知道如何从这里开始。

df.groupby(['country', 'source']).size() 

country  source
China    Ads       21561
         Direct    17463
         Seo       37578
Germany  Ads        3760
         Direct     2864
         Seo        6432
UK       Ads       13518
         Direct    11131
         Seo       23801
US       Ads       49901
         Direct    40962
         Seo       87229

我正在寻找这样的东西:

      Ads   SEO  Direct 

US    .3     .1   .4    
China .5     .3   .2
UK    .5     .3   .6

【问题讨论】:

【参考方案1】:

您可以使用unstack将结果从长格式转换为宽格式,然后使用apply方法逐行计算比率:

import pandas as pd
df1 = df.groupby(['country', 'source']).size().unstack(level=1,fill_value = 0).apply(lambda r: r/r.sum(), axis = 1)

df1
# source      Ads   Seo
#country        
#  China      0.0   1.0
#     UK      1.0   0.0
#     US      0.2   0.8

【讨论】:

【参考方案2】:

您可以使用pd.crosstab 执行频率计数,然后使用apply 进行归一化:

df = pd.crosstab(df['country'], df['source']).apply(lambda r: r/r.sum(), axis=1)

【讨论】:

【参考方案3】:

大样本集

np.random.seed([3,1415])
n = 100000
df = pd.DataFrame(
    dict(country=np.random.choice(('UK', 'US', 'China'), n),
         source=np.random.choice(('Ads', 'Seo', 'Direct'), n)))

解决方案

size = df.groupby(['country', 'source']).size().unstack()
size.div(size.sum(1), axis=0)


时间

使用此帖子中的数据

【讨论】:

看起来你沿着错误的轴潜水,因为列加到 1,但行不完全。很难用样本数据来判断,因为它分布得如此均匀,但可以尝试使用 source=np.random.choice(('Ads', 'Seo', 'Direct'), n, p=(0.1, 0.1, 0.8))) 之类的东西,并将计数与百分比进行比较。 @root 你是绝对正确的。谢谢。我修好了。

以上是关于数据库的group by有啥意义呢?的主要内容,如果未能解决你的问题,请参考以下文章

SQL数据库中查询语句Order By和Group By有啥区别

SQL数据库中查询语句Order By和Group By有啥区别

only_full_group_by 模式有啥好处?

数据库的group 和group by 的用法?

数据库 --- Group by的使用心得

GROUP BY 和 DISTINCT 之间有啥区别吗