tmp.num AS num,
-- 这里通过case when判断避免除0异常
CASE WHEN SUM (tmp.numm) OVER ()=0 THEN '0.00%' ELSE
round(
CAST (
100.0 * tmp.num / SUM (tmp.num) OVER ()
) AS NUMERIC
) || '%' END AS percentage
from tmp
假设有下列结果集tmp:type num 1 5 2 5 需要根据type分组统计百分比如:type num percentage 1 5 50% 2 5 50% 使用sum() over()计算百分比的sql如下:SELECT tmp.type AS type, tmp.num AS num, -- 这里通过case when判断避免除0异常 CASE WHEN SUM (tmp.numm) ..
用于聚合
计算
的窗口函数:
sum
() over(); count() over(); avg() over;
用于
分组
排序的窗口函数:row_number() over(); rank() over();
用于
分组
查询的窗口函数:ntile() o...
那如果我们需要知道按某一种字段进行排序得到的求和结果和其组成的数据呢?
SELECT ord,num,
sum
(num) over(ORDER BY ord) FROM cx.over_test;
那再如果我们需要按某一字段进行求和展示.
1、聚合函数
聚合函数可以对结果集进行
计算
,常用的聚合函数有 avg()、
sum
()、min()、max()、count()等,本节 将介绍
PostgreSQL
两个特殊功能的聚合函数并给出测试示例。 在介绍两个聚合函数之前,先来看一个应用场景,假如一 张表有以下数据:
中国 台北
中国 香港
中国 上海
日本 东京
日本 大阪
要求得到如下结果集:
中国 台北,香港,上海
日本 .
一、 窗口函数
PG
是在8.4以后版本中添加了一些窗口函数的功能,所谓窗口函数就是对
分组
中的每个行都返回
分组
结果,而聚合函数则是对
分组
中的每个组只返回一个
分组
结果,对于这句话大家可能还不理解,不过没关系,下面通过实例来讲解。
1、
PG
窗口函数有(黄底的为常用窗口函数):
sum
(): 组内求和
avg(): 组内平均
row_number(): 组内排序,
大数据时代,人们使用数据库系统处理的数据量越来越大,请求越来越复杂,对数据库系统的大数据处理能力和混合负载能力提出更高的要求。
PostgreSQL
作为世界上最先进的开源数据库,在大数据处理方面做了很多工作,如并行和分区。
PostgreSQL
从 2016 年发布的 9.6 开始支持并行,在此之前,
PostgreSQL
仅能使用一个进程处理用户的请求,无法充分
利用
资源,亦无法很好地满足大数据量、复杂查询下的性能需求。2018 年 10 月发布的
PostgreSQL
11,在并行方面做了大量工作,支持了并
两种方法:自行
计算
和使用
postgresql
内置函数
计算
1.1. 使用(row -1 )/ (count - 1)方式,即该数所在位置(从小到大排列)/ 该列总个数
首先,使用row_num函数从小到大排列:
select * from( select row_num() over(partition by id字段 order by
计算
字段)rn,* from 表名);
然后,
计算
总数:
select count(*) as cont f
WHEN age <= 18 THEN 'Under 18'
WHEN age BETWEEN 19 AND 30 THEN '19-30'
WHEN age BETWEEN 31 AND 40 THEN '31-40'
WHEN age BETWEEN 41 AND 50 THEN '41-50'
ELSE 'Over 50'
END AS age_group,
COUNT(*) AS count
people
GROUP BY
age_group;
在这个示例中,我们假设有一个名为people的表,其中包含每个人的年龄信息。我们使用CASE语句将人员
分组
为五个年龄段,并使用GROUP BY子句将它们
分组
,然后使用COUNT函数
计算
每个年龄段的计数。