数据库的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有啥区别