postgresql之聚集函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
聚集函数
和大多数其他数据库一样,postgresql支持聚集函数,一个聚集函数从多个输入行中计算出一个结果。比如,我们有在一个行集合上计算count(数目),sum(和),avg(均值),max(最大值)和min(最小值)的函数。
比如,我们可以用下面的语句找出所有记录中中低温中的最高温度:SELECTmax(temp_lo)FROMweather;
max-----46(1row)
如果我们想知道该读数发生在哪个城市,我们可以用SELECTcityFROMweatherWHERE
temp_lo=max(temp_lo);WRONG
不过这个方法不能运转,因为聚集max不能用于where子句中。(存在这个限制是因为where子句决定哪些行可以进入聚集阶段;因此它必须在聚集函数之前计算。)不过,我们通常都可以用其他方法实现我们的目的;在这里我们就可以使用子查询:SELECTcityFROMweatherWHEREtemp_lo=
(SELECT
max(temp_lo)FROMweather);
city---------------SanFrancisco(1row)
这样做是OK的,因为子查询是一次独立的计算,它独立于外层的查询计算出自己的聚集。
聚集同样也常用于group by子句中。比如,我们可以获取每个城市低温的最高值
SELECTcity,max(temp_lo)
FROMweatherGROUPBYcity;
city
|max
---------------+-----Hayward
|37
SanFrancisco|46(2rows)
这样给我们每个城市一个输出。每个聚集结果都是在匹配该城市的行上面计算的。我们可以用having过滤这些分组:
SELECTcity,max(temp_lo)
FROMweatherGROUPBYcity
HAVINGmax(temp_lo)<40;
city|max
---------+-----
Hayward|37
(1row)
这些就只给出那些temp_lo数值曾经有低于40度温度的城市。最后,如果我们只关心那些名字以“S”开头的城市,我们可以用:ELECTcity,max(temp_lo)
FROMweather
WHEREcityLIKE'S%'(1)GROUPBYcity HAVINGmax(temp_lo)<40;