A. sql 语句中那些是聚合函数
常见聚合函数,max(最大)、min(最小)、sum(求和)、avg(平均)等,
示例如下,
1、创建测试表,
create table test_group(id number, value number);
B. sql聚合函数有哪些
聚集函数
和大多数其它关系数据库产品一样,PostgreSQL
支持聚集函数。一个聚集函数从多个输入行中计算出一个结果。比如,我们有在一个行集合上计算
count(数目),
sum(总和),
avg(均值),
max(最大值),
min(最小值)的函数。
比如,我们可以用下面的语句找出所有低温中的最高温度:
SELECT
max(temp_lo)
FROM
weather;
max
-----
46
(1
row)如果我们想知道该读数发生在哪个城市,可能会用:
SELECT
city
FROM
weather
WHERE
temp_lo
=
max(temp_lo);
--
错!不过这个方法不能运转,因为聚集函数
max
不能用于
WHERE
子句中。存在这个限制是因为
WHERE
子句决定哪些行可以进入聚集阶段;因此它必需在聚集函数之前计算。不过,我们可以用其它方法实现这个目的;这里我们使用子查询:
SELECT
city
FROM
weather
WHERE
temp_lo
=
(SELECT
max(temp_lo)
FROM
weather);
city
---------------
San
Francisco
(1
row)这样做是可以的,因为子查询是一次独立的计算,它独立于外层查询计算自己的聚集。
聚集同样也常用于
GROUP
BY
子句。比如,我们可以获取每个城市低温的最高值:
SELECT
city,
max(temp_lo)
FROM
weather
GROUP
BY
city;
city
|
max
---------------+-----
Hayward
|
37
San
Francisco
|
46
(2
rows)这样每个城市一个输出。每个聚集结果都是在匹配该城市的行上面计算的。我们可以用
HAVING
过滤这些分组:
SELECT
city,
max(temp_lo)
FROM
weather
GROUP
BY
city
HAVING
max(temp_lo)
<
40;
city
|
max
---------+-----
Hayward
|
37
(1
row)这样就只给出那些
temp_lo
值曾经有低于
40
度的城市。最后,如果我们只关心那些名字以"S"开头的城市,我们可以用:
SELECT
city,
max(temp_lo)
FROM
weather
WHERE
city
LIKE
'S%'
GROUP
BY
city
HAVING
max(temp_lo)
<
40;语句中的
LIKE
执行模式匹配,在节9.7里有解释。
理解聚集和
SQL
的
WHERE
和
HAVING
子句之间的关系非常重要。WHERE
和
HAVING
的基本区别如下:WHERE
在分组和聚集计算之前选取输入行(它控制哪些行进入聚集计算),而
HAVING
在分组和聚集之后选取输出行。因此,WHERE
子句不能包含聚集函数;因为试图用聚集函数判断那些行将要输入给聚集运算是没有意义的。相反,HAVING
子句总是包含聚集函数。当然,你可以写不使用聚集的
HAVING
子句,但这样做没什么好处,因为同样的条件可以更有效地用于
WHERE
阶段。
在前面的例子里,我们可以在
WHERE
里应用城市名称限制,因为它不需要聚集。这样比在
HAVING
里增加限制更加高效,因为我们避免了为那些未通过
WHERE
检查的行进行分组和聚集计算。
C. 第十三章 SQL聚合函数 XMLAGG
一个聚合函数,它创建一个串接的值字符串。
XMLAGG 聚合函数返回由 string-expr 中的所有值组成的串接字符串。
返回值的数据类型为 VARCHAR ,默认长度为 4096 。
以下两个示例都返回相同的单个值,即 Sample.Person 表的 Home_State 列中列出的所有值的串联字符串。
请注意,此连接字符串包含重复值。
返回值中将省略 string-expr 为NULL的行。如果至少返回一个非空字符串值,则从返回值中省略 string-expr 为空字符串( '' )的行。如果唯一非空的 string-expr 值是空字符串( '' ),则返回值是单个空字符串。
XMLAGG 不支持数据流字段。为 string-expr 指定流字段会导致 SQLCODE-37 。
XMLAGG 的一个常见用法是标记列中的每个数据项。这是通过组合 XMLAGG 和 XMLELEMENT 来实现的,如下例所示:
这将产生如下所示的输出字符串:
XMLAGG 函数将来自多行的表列的值连接到单个字符串中。因为在计算所有聚合字段之后,将逐个从句应用于查询结果集,所以逐个不能直接影响该字符串中的值序列。在某些情况下, XMLAGG 结果可能会按顺序显示,但不应依赖此排序。给定聚合结果值中列出的值无法显式排序。
下面的示例创建在 Sample.Person 表的 FavoriteColors 列中找到的所有不同值的串联字符串。因此,对于 ALL_COLLES 列,每行都有相同的值。请注意,虽然有些行的 FavoriteColors 为空值,但该值不包括在连接的字符串中。数据值以内部格式返回。
下面的示例返回以 “A” 开头的 Home_State 值的串联字符串。它返回不同的 Home_State 值(不同的 Home_State );与不同的 Home_City 值对应的 Home_State 值(与( Home_City ) Home_State 不同),其中可能包括 Home_City 的一个唯一NULL;以及所有 Home_State 值:
下面的示例为每个州创建在 Home_City 列中找到的所有不同值的串联字符串。同一州的每一行都包含该州所有不同城市值的列表:
以下示例使用 %AFTERHAVING 关键字。它为每个包含至少一个满足 HAVING 子句条件(以 “C” 或 “K” 开头的名称)的 Name 值的 Home_State 返回一行。第一个 XMLAGG 函数返回由该州的所有名称组成的连接字符串。第二个 XMLAGG 函数返回仅由满足 HAVING 子句条件的名称组成的连接字符串:
对于以下示例,假设我们有下表 AutoClub :
D. 第十章 SQL聚合函数 STDDEV, STDDEV_SAMP, STDDEV_POP
返回数据集的统计标准差的聚合函数。
除非表达式的数据类型为 DOUBLE ,否则这些函数将返回数字数据类型。如果表达式为 DOUBLE ,则返回 DOUBLE 。
这三个标准差聚合函数在丢弃NULL值后返回表达式值分布的统计标准差。
也就是说,从数据集的平均值的标准差的量,表示为一个正数。
返回值越大,值的数据集的变化就越大。
STDDEV、STDDEV_SAMP (sample) 和 STDDEV_POP (population) 函数是由相应的方差聚合函数派生而来的:
标准差是相应方差值的平方根。
这些标准差函数可以在引用表或视图的 SELECT 查询或子查询中使用。
它们可以在 SELECT 列表或 HAVING 子句中与普通字段值一起出现。
这些标准偏差函数不能在 WHERE 子句中使用。
它们不能在 JOIN 的 ON 子句中使用,除非 SELECT 是子查询。
这些标准偏差函数返回数据类型 NUMERIC 的值,精度为 36 ,刻度为 17 ,除非表达式是数据类型 DOUBLE ,在这种情况下它返回数据类型 DOUBLE 。
这些函数通常应用于具有数值的字段或表达式。
它们将非数值值(包括空字符串( " ))计算为零( 0 )。
这些标准偏差函数会忽略数据字段中的 NULL 值。
如果查询没有返回行,或者返回的所有行的数据字段值为 NULL ,则返回 NULL 。
与所有聚合函数一样,标准差函数可以采用一个可选的 DISTINCT 子句。
STDDEV(DISTINCT col1) 返回那些不同(唯一)的 col1 字段值的标准偏差。
STDDEV(DISTINCT BY(col2) col1) 返回记录中 col1 字段值的标准差,其中 col2 值是不同的(唯一的)。
但是请注意,不同的 col2 值可能包含一个单独的 NULL 值。
与所有聚合函数一样,标准偏差函数总是返回数据的当前状态,包括未提交的更改,而不考虑当前事务的隔离级别。
下面的示例使用 STDDEV 返回员工年龄的标准偏差。
,以及一个或多个员工代表的不同年龄的标准差:
下面的示例使用 STDDEV_POP 返回员工年龄的总体标准差。
,以及一个或多个员工代表的不同年龄的标准差:
E. sql 聚合函数有哪些
聚合函数是对一组值执行计算并返回单一的值的函数,它经常与SELECT语句的GROUP BY子句一同使用,SQL SERVER 中具体有哪些聚合函数呢?我们来一一看一下:
1. AVG 返回指定组中的平均值,空值被忽略。
例:select prd_no,avg(qty) from sales group by prd_no
2. COUNT 返回指定组中项目的数量。
例:select count(prd_no) from sales
3. MAX 返回指定数据的最大值。
例:select prd_no,max(qty) from sales group by prd_no
4. MIN 返回指定数据的最小值。
例:select prd_no,min(qty) from sales group by prd_no
5. SUM 返回指定数据的和,只能用于数字列,空值被忽略。
例:select prd_no,sum(qty) from sales group by prd_no
6. COUNT_BIG 返回指定组中的项目数量,与COUNT函数不同的是COUNT_BIG返回bigint值,而COUNT返回的是int值。
例:select count_big(prd_no) from sales
7. GROUPING 产生一个附加的列,当用CUBE或ROLLUP运算符添加行时,输出值为1.当所添加的行不是由CUBE或ROLLUP产生时,输出值为0.
例:select prd_no,sum(qty),grouping(prd_no) from sales group by prd_no with rollup
8. BINARY_CHECKSUM 返回对表中的行或表达式列表计算的二进制校验值,用于检测表中行的更改。
例:select prd_no,binary_checksum(qty) from sales group by prd_no
9. CHECKSUM_AGG 返回指定数据的校验值,空值被忽略。
例:select prd_no,checksum_agg(binary_checksum(*)) from sales group by prd_no
10. CHECKSUM 返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引。
11. STDEV 返回给定表达式中所有值的统计标准偏差。
例:select stdev(prd_no) from sales
12. STDEVP 返回给定表达式中的所有值的填充统计标准偏差。
例:select stdevp(prd_no) from sales
13. VAR 返回给定表达式中所有值的统计方差。
例:select var(prd_no) from sales
14. VARP 返回给定表达式中所有值的填充的统计方差。
例:select varp(prd_no) from sales
F. SqlServer如何用Sql语句自定义聚合函数
有两个写法:
select*fromtblDept
whereidin(
count(casewhenSalary>3000then1elsenullend)*1.0/count(*)>0.5)
或
select*fromtblDept
whereidin(
sum(casewhenSalary>3000then1else0end)*1.0/count(*)>0.5)
G. sql语句中如何将聚合函数值和另一个值相乘
sql中提供的聚合函数,通常包括sum,count,avg,max,min,但不包括乘法;
比如有这样一个数据集:
id x
1 1
1 2
1 3
2 4
2 5
2 6
;
想实现成如下形式
id prob_x
1 6
2 120
即让第一组中1*2*3=6
第二组中4*5*6=120
用data步中first+retain可以实现,但data需要先排序;
而sql的聚合函数中也没有相乘这一函数,于是有些牛人想到通过数学转化,将乘法转为加法,而sql中可以
用sum实现加法聚合。
说来也简单,主要想法就是A*B=exp(lnA*B)=exp(lnA+lnB);
select id,exp(sum(log(x))) as prob_x from data_set group by id;
=============================================
但我觉得也需要补充一点东西:
首先有0的情况下,log函数的定义域为{x>0},有0出现的时候,改组最后结果肯定为0;
其次是有负数的情况,需要对绝对值进行计算,计算每组负数的个数,如果负数是偶数个,那么结果为正,
如果为奇数个,则需要在结果上添上负号。
最后可以写成这样
select id,(case when sum(case when x=0 then 1 else 0 end) >0 then 0
when mod(sum(case when x<0 then 1 else 0 end),2)=0 then exp(sum(log(x)))
else -1*exp(sum(log(abs(x)))) end) as prod_x from data_set group by id;
H. 在SQL中的聚合函数
原则上,你要用group by,那么前面抽取的字段必须要作为分组依据,否则就需要sum,avg,max等函数的处理。