DM达梦数据库分析函数整理

2024-07-02 08:34:25 浏览数 (1)

引言

在复杂的数据分析场景中,达梦数据库的分析函数扮演着至关重要的角色。它们允许用户在单个查询中对数据进行分组、排序、排名及聚合计算,极大地提升了数据分析的灵活性和效率。本篇将深入探讨达梦数据库中几种关键的分析函数,并通过具体案例SQL来解析其用法,帮助你更好地掌握这些强大的工具。

一、窗口函数基础

窗口函数(Window Function)在处理数据时,为每一行数据定义了一个“窗口”(一组行),在该窗口内进行计算。这使得我们能够在保留表的原始行结构的同时,进行分组统计或排序比较。

1. RANK()DENSE_RANK()
案例:员工销售排名

假设有一个sales_data表,记录了员工的销售业绩。

代码语言:javascript复制
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 BYORDER 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()按部门及入职日期为员工分配行号。

0 人点赞