参考资料:有序聚集函数
本文接着上文继续介绍postgreSQL中常见的语法和概念,部分概念参考上述链接,佐以自己实操示例,侵删。
涉及到的内容:交互式分析、有序聚集函数、mode() within group (order by col1)、sum(col3) over (partition by col1 order by col2)、sum(col3) over (partition by col1, col2)
交互式分析(mode()函数)
- 概念:
交互式分析(Hologres)兼容PostgreSQL,使用标准的PostgreSQL语法开发。
当前Hologres版本支持的函数时PostgreSQL的一个子集,已支持的有序聚集函数列表如下:
- 示例
select mode() within group (order by altitude),
mode() within group (order by longitude)
from data_info;
功能:从data_info表中分别取出出现频率最多的纬度和经度数据。
结果:
对上述代码稍作修改:
select mountain_name,
mode() within group (order by altitude) as m_altitude,
mode() within group (order by longitude) as m_longitude,
from data_info
group by moutain_name;
功能:跟上述功能类似,不过每个mountain_name都只取一条数据,而mode()统计的也只是每个相同的mountain_name下出现最频繁的经纬度的数据。
运行结果:
注意:在使用mode() within函数时,每次select只有两种选择:
(1)只有mode()函数:则会对整表的该列做统计分析,得出频率最高数据。
(2)有其它字段,也有mode()函数:所有单独的字段都必须要在group by 中有所体现,返回所有其它字段都相同时该列频率最高数据。
否则,将会有类似以下内容报错:
data_info.mountain_name must appear in the GROUP BY clause or be used in an aggregate function.
sum(col3) over (partition by col1 order by col2)
over (partition by col1 order by col2)
- 概念:
此函数在上篇初学之路(一)已经有所提及,当时是结合row_number()函数进行讲解,但讲解的不够透彻,这里讲结合sum函数来更加深入讲解。 - 功能:
表示根据col1分组,在分组内部根据col2排序。
与sum()结合后的partition函数
- sum()
sum()函数在SQL中就是对某一列进行求和。 - sum(col3) over (partition by col1 order by col2)
根据col1进行分组,在分组内部根据col2排序,按照排序的顺序对col3求和(分组内不断累加)。 - 示例
执行:
select *,
sum(grade) over (partition by class order by age)
from public.grade_list;
结果:
注意:
当order by col2 中的col2的数据相等时,认为它们的排序是相同的,那么执行sum()时所有class和age都相等的数据它们的sum结果也是相等的,值为它们的grade的总和。
4. 对于函数avg(), max()等同理。
sum(col3) over (partition by col1, col2)
- 概念:
如果说partition by col1 order by col2是按照col1分组,按照col2排序的话,partition by col1, col2则为按照col1和col2分组,即只有col1和col2都相同的数据才会被分为一组。 - max()
求分组内最大值。 - 示例
数据:与上例相同
执行:
select *,
sum(grade) over (partition by class, age)
from public.grade_list;
结果:
结论:只有再age和class都相同时才视为一组,并计算分组内总和。
注意:一定要注意区分和partition by col1 order by col2 的区别。