在PostgreSQL中提供了很多丰富的内置函数来进行数据处理操作,例如对于字符串的处理、数值处理、日期时间处理等。当然它也提供了关于数据计算处理的相关操作函数,下面我们就来详细的介绍一下这些常用的数据处理相关的函数。
数据求和
sum(expr): 对指定的数据列中的所有数据进行求和操作,如下所示。
SELECT SUM(salary) FROM employee;
求平均数
avg(expr): 对给定的数据列中的数据进行求平均数的操作,如下所示。
SELECT AVG(age) FROM person;
求最大值和最小值
- max(expr): 用于返回给定数据列中的数据最大值。
- min(expr): 用于返回给定数据列中的数据最小值。
SELECT MAX(salary) FROM employee;
SELECT MIN(age) FROM person;
计数统计
count(expr): 用于统计满足条件的数据行的数量,如下所示。
SELECT COUNT(*) FROM orders WHERE status = 'completed';
求环比
求环比也就是环比增长率,它是指相对于上一个周期的增长率,在通常情况下用于比较相邻时间段的数据变化情况。而在PostgreSQL中,我们可以使用窗口函数和LAG函数来计算环比操作,如下所示。
SELECT
current_month,
value,
LAG(value, 1) OVER (ORDER BY current_month) AS previous_value,
(value - LAG(value, 1) OVER (ORDER BY current_month)) / LAG(value, 1) OVER (ORDER BY current_month) AS growth_rate
FROM
monthly_data;
标准差和方差
- stddev(expr): 用于计算给定的数据列的标准差。
- variance(expr): 用于计算给定数据列的方差。
SELECT STDDEV(sales_amount) FROM sales_data;
SELECT VARIANCE(sales_amount) FROM sales_data;
提取中位数
- percentile_cont(fraction) WITHIN GROUP (ORDER BY expr): 计算给定列的指定百分比的分位数。
- percentile_disc(fraction) WITHIN GROUP (ORDER BY expr): 计算给定列的指定百分比的离散分位数。
如下所示
SELECT
percentile_cont(0.5) WITHIN GROUP (ORDER BY age) AS median_age
FROM
person;
频率分布
- count(expr) FILTER (WHERE condition): 用于计算满足条件的数据行数。
- count(*) FILTER (WHERE condition): 计算满足条件的总行数。
- sum(expr) FILTER (WHERE condition): 根据给定条件对数据进行求和操作。
如下所示
SELECT
COUNT(*) FILTER (WHERE age < 30) AS age_under_30_count,
COUNT(*) AS total_count,
COUNT(*) FILTER (WHERE age < 30) / COUNT(*)::numeric AS age_under_30_percentage
FROM
person;
排名和窗口函数
- rank(), dense_rank(): 根据指定行来计算排名情况。
- row_number(): 为每个指定行分配一个唯一的序号。
- ntile(num_buckets): 将指定的数据划分成指定数量的数据桶。
如下所示
SELECT
name,
salary,
rank() OVER (ORDER BY salary DESC) AS salary_rank,
dense_rank() OVER (ORDER BY salary DESC) AS salary_dense_rank,
row_number() OVER (ORDER BY salary DESC) AS salary_row_number,
ntile(4) OVER (ORDER BY salary DESC) AS salary_ntile
FROM
employee;
ntile(num_buckets)函数用来将数据划分成指定数量的桶或者是分位数,它是将数据按照指定的排序分成几个大致相同的数据组,并且为每个数据分组指定一个桶号,从 1 到指定的桶数量。如果数据无法均匀地分配到每个桶中,某些桶可能会比其他桶多一个元素。
例如,你可能想将员工的工资分成四个桶,根据工资水平将员工分为低工资组、中低工资组、中高工资组和高工资组,然后针对每个组进行不同的分析或处理。在这种情况下,你可以使用 ntile(4) 函数将数据分成四个桶。
总结
当然在实际开发过程中,可能会遇到比上述内容更加复杂的数据处理操作,我们需要根据实际的需求来确定使用什么样的处理函数来对数据进行使用。例如可以对数据做一些格式化的处理操作等等。