引言
在复杂的数据分析场景中,达梦数据库的分析函数扮演着至关重要的角色。它们允许用户在单个查询中对数据进行分组、排序、排名及聚合计算,极大地提升了数据分析的灵活性和效率。本篇将深入探讨达梦数据库中几种关键的分析函数,并通过具体案例SQL来解析其用法,帮助你更好地掌握这些强大的工具。
一、窗口函数基础
窗口函数(Window Function)在处理数据时,为每一行数据定义了一个“窗口”(一组行),在该窗口内进行计算。这使得我们能够在保留表的原始行结构的同时,进行分组统计或排序比较。
1. RANK()
与DENSE_RANK()
案例:员工销售排名
假设有一个sales_data
表,记录了员工的销售业绩。
SELECT
employee_id,
sale_amount,
RANK() OVER (ORDER BY sale_amount DESC) AS rank,
DENSE_RANK() OVER (ORDER BY sale_amount DESC) AS dense_rank
FROM sales_data;
RANK()
会为销售金额降序排列的每个员工分配一个唯一的排名,相同销售额的员工会有相同的排名,但会导致后续排名跳过(如两个第一,则无第二,直接到第三)。DENSE_RANK()
则不会跳过排名,即使有相同的销售额,也会紧接上一个排名给出下一个连续的排名。
二、分组累加与平均值
2. SUM() OVER ()
与AVG() OVER ()
案例:计算累计销售额与平均销售额
代码语言:javascript复制SELECT
month,
SUM(sale_amount) OVER (ORDER BY month) AS cumulative_sales,
AVG(sale_amount) OVER (ORDER BY month) AS moving_average
FROM sales_data;
SUM() OVER ()
按月份顺序计算累计销售额。AVG() OVER ()
计算截至当前月的移动平均销售额。
三、分区分组与排序
3. PARTITION BY
与ORDER BY
案例:按部门计算员工销售排名
代码语言:javascript复制SELECT
department,
employee_id,
sale_amount,
RANK() OVER (PARTITION BY department ORDER BY sale_amount DESC) AS department_rank
FROM sales_data;
- 使用
PARTITION BY department
对不同部门内的员工销售业绩进行独立排名。
四、偏移量函数
4. LAG()
与LEAD()
案例:获取上个月与下个月的销售额
代码语言:javascript复制SELECT
month,
sale_amount,
LAG(sale_amount) OVER (ORDER BY month) AS prev_month_sales,
LEAD(sale_amount) OVER (ORDER BY month) AS next_month_sales
FROM sales_data;
LAG()
获取前一行(上个月)的销售额。LEAD()
获取后一行(下个月)的销售额。
五、统计函数
5. COUNT() OVER ()
与ROW_NUMBER()
案例:统计部门内员工总数及分配行号
代码语言:javascript复制SELECT
department,
employee_id,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY hire_date) AS row_num,
COUNT(*) OVER (PARTITION BY department) AS total_employees
FROM employee_details;
COUNT() OVER (PARTITION BY department)
计算每个部门的员工总数。ROW_NUMBER()
按部门及入职日期为员工分配行号。