使用窗口函数进行高效数据分析

发布时间: 2023-12-15 08:51:59 阅读量: 102 订阅数: 33
PDF

SQL中窗口函数的使用

# 1. 简介 ## 1.1 什么是窗口函数 窗口函数是一种高级的SQL分析函数,它可以在对查询结果进行聚合、排序、分析等操作时,提供更加灵活和强大的功能。窗口函数可以用来执行诸如排名、累计、移动平均等复杂的分析,而不需要使用复杂的子查询或自连接操作。 ## 1.2 窗口函数在数据分析中的作用 窗口函数在数据分析中扮演着关键的角色,能够对数据进行分组、排序、聚合和分析,使得分析结果更加精细和全面。它能够处理某些传统的聚合函数难以处理的复杂分析场景,因此在数据挖掘、业务智能等领域得到了广泛应用。 ## 1.3 本文概述 ## 2. 窗口函数基础 窗口函数是一种在关系型数据库中进行数据分析的强有力工具。通过窗口函数,我们可以对行和列进行分组、排序、累计、聚合等各种操作,以获得更加准确和灵活的数据分析结果。 ### 2.1 窗口函数的定义和语法 窗口函数是在查询结果集的每一行上执行计算的函数,它能够返回与当前行相关的其他行的计算结果。窗口函数的语法如下: ``` <窗口函数> OVER ([PARTITION BY <分组列>] [ORDER BY <排序列>] [ROWS <窗口范围>]) ``` 其中,`PARTITION BY`用于对查询结果进行分组,`ORDER BY`用于对每个分组内的行进行排序,`ROWS`用于指定窗口的范围。 ### 2.2 常用的窗口函数类型 在窗口函数的定义中,常见的窗口函数类型包括: - `ROW_NUMBER()`:为每一行分配一个唯一的行号。 - `RANK()`:为每一行分配一个排名,相同值的行会得到相同的排名。 - `DENSE_RANK()`:为每一行分配一个排名,相同值的行会得到相同的排名,但不会跳过中间的排名值。 - `NTILE(<n>)`:将结果集分为`n`等份,并为每个部分分配一个编号。 - `LEAD(<列>, <偏移量>)`:返回指定列在指定偏移量行之后的值。 - `LAG(<列>, <偏移量>)`:返回指定列在指定偏移量行之前的值。 - `SUM()`:计算指定列的总和。 - `AVG()`:计算指定列的平均值。 - `COUNT()`:计算指定列的非空行数。 除了上述常用的窗口函数类型,还有其他的窗口函数可以根据需求进行选择和使用。 ### 2.3 窗口函数的参数和用法示例 窗口函数的参数包括: - `PARTITION BY`:用于指定分组列,将结果集按照指定列进行分组。 - `ORDER BY`:用于指定排序列,对每个分组内的行进行排序。 - `ROWS`:用于指定窗口的范围,可以是指定偏移量的行数,也可以是行的区间。 下面通过示例来演示窗口函数的使用: ```python -- 假设有以下数据表 orders | order_id | customer_id | order_date | total_amount | |----------|-------------|------------|--------------| | 1 | 1001 | 2020-01-01 | 100 | | 2 | 1002 | 2020-01-02 | 200 | | 3 | 1001 | 2020-01-03 | 150 | | 4 | 1003 | 2020-01-03 | 300 | | 5 | 1002 | 2020-01-04 | 250 | -- 示例1:使用ROW_NUMBER()函数获取每个客户的订单行号 SELECT order_id, customer_id, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS row_number FROM orders; -- 示例2:使用RANK()函数获取每个客户的订单排名 SELECT order_id, customer_id, total_amount, RANK() OVER (PARTITION BY customer_id ORDER BY total_amount DESC) AS rank FROM orders; -- 示例3:使用LEAD()函数获取下一个订单的日期 SELECT order_id, order_date, LEAD(order_date, 1) OVER (ORDER BY order_date) AS next_order_date FROM orders; ``` 通过上述示例,我们可以看到窗口函数的灵活性和强大功能。我们可以根据业务需求选择合适的窗口函数,并结合`PARTITION BY`、`ORDER BY`和`ROWS`等参数来实现各种数据分析操作。 ### 3. 窗口函数的高效数据分析应用 窗口函数在数据分析中具有广泛的应用,能够帮助分析师和数据科学家们进行高效的数据处理和分析。以下是窗口函数在数据分析中的一些常见应用: #### 3.1 排名和排序相关分析 窗口函数可以轻松实现对数据的排名和排序操作,例如找出销售额的Top N产品或者对某个指标进行排名,并可以根据需要进行分组排序。 ```python -- 示例:使用窗口函数实现对销售额的排名 SELECT product_id, sales, RANK() OVER(ORDER BY sales DESC) as sales_rank FROM sales_table; ``` #### 3.2 累积和移动平均分析 利用窗口函数,可以进行累积和移动平均分析,比如计算某个指标的累积值或者平均值,并且可以设定不同大小的窗口进行灵活的数据分析。 ```java // 示例:使用窗口函数计算每日销售额的7天移动平均值 SELECT sales_date, sales_amount, AVG(sales_amount) OVER(ORDER BY sales_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as moving_avg FROM daily_sales_table; ``` #### 3.3 分组和分区分析 窗口函数可以实现对数据的分组和分区分析,比如对每个分组内部进行排序、排名或者聚合操作,非常适合需要按照某种规则对数据进行分组计算的场景。 ```go // 示例:使用窗口函数计算每个部门的员工薪资排名 SELECT department_id, employee_name, salary, RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) as salary_rank FROM employee_salary_table; ``` #### 3.4 聚合和统计分析 通过窗口函数,可以进行灵活的聚合和统计分析,比如计算某个指标在一定窗口范围内的最大、最小、平均值等统计量,同时也可以进行累积求和或者累积计数的操作。 ```javascript // 示例:使用窗口函数计算每月销售额与月初累积销售额 SELECT sales_month, sales_amount, SUM(sales_amount) OVER(ORDER BY sales_month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as cumulative_sales FROM monthly_sales_table; ``` 窗口函数在数据分析中具有极大的灵活性和适用性,能够帮助数据分析师更加高效地进行复杂数据处理和分析,为业务决策提供有力支持。 ### 4. 实例演示:使用窗口函数进行数据分析 本章将通过几个实例演示如何使用窗口函数进行数据分析,包括基本数据分析、递进式分析和复杂数据分析案例。 #### 4.1 数据准备与导入 在进行数据分析前,首先需要准备和导入相应的数据。假设我们有一个销售数据表,包含以下字段:日期(date)、产品(product)、销售额(sales)。我们将从数据库中导入这个表作为实例数据。 ```python import psycopg2 # 数据库连接信息 conn = psycopg2.connect(database="your_database", user="your_username", password="your_password", host="your_host", port="your_port") cursor = conn.cursor() # 导入数据表 sales_data cursor.execute("CREATE TABLE sales_data (date DATE, product VARCHAR, sales INT)") cursor.execute("INSERT INTO sales_data VALUES ('2022-01-01', 'A', 100)") cursor.execute("INSERT INTO sales_data VALUES ('2022-01-01', 'B', 200)") cursor.execute("INSERT INTO sales_data VALUES ('2022-01-02', 'A', 150)") cursor.execute("INSERT INTO sales_data VALUES ('2022-01-02', 'B', 250)") cursor.execute("INSERT INTO sales_data VALUES ('2022-01-03', 'A', 120)") cursor.execute("INSERT INTO sales_data VALUES ('2022-01-03', 'B', 180)") # 提交事务并关闭连接 conn.commit() cursor.close() conn.close() ``` #### 4.2 基本数据分析案例 窗口函数在基本数据分析中可以做到类似GROUP BY和聚合函数的功能,但更灵活、高效。下面以计算每天的销售总额为例进行演示。 ```python import psycopg2 # 数据库连接信息 conn = psycopg2.connect(database="your_database", user="your_username", password="your_password", host="your_host", port="your_port") cursor = conn.cursor() # 查询每天的销售总额 cursor.execute("SELECT date, SUM(sales) OVER (ORDER BY date) AS total_sales FROM sales_data") # 提取结果集 rows = cursor.fetchall() # 打印结果 for row in rows: print("Date: {} - Total Sales: {}".format(row[0], row[1])) # 关闭连接 cursor.close() conn.close() ``` 执行以上代码,将会输出每天的销售总额: ``` Date: 2022-01-01 - Total Sales: 300 Date: 2022-01-02 - Total Sales: 700 Date: 2022-01-03 - Total Sales: 1000 ``` #### 4.3 递进式分析案例 递进式分析是指窗口函数可以对某个指标进行累计或递进分析。例如,我们可以计算每个产品的销售累计额(累计销售额 = 当前销售额 + 上个产品的累计销售额)。 ```python import psycopg2 # 数据库连接信息 conn = psycopg2.connect(database="your_database", user="your_username", password="your_password", host="your_host", port="your_port") cursor = conn.cursor() # 查询每个产品的销售累计额 cursor.execute("SELECT date, product, sales, SUM(sales) OVER (PARTITION BY product ORDER BY date) AS cumulative_sales FROM sales_data") # 提取结果集 rows = cursor.fetchall() # 打印结果 for row in rows: print("Date: {} - Product: {} - Sales: {} - Cumulative Sales: {}".format(row[0], row[1], row[2], row[3])) # 关闭连接 cursor.close() conn.close() ``` 执行以上代码,将会输出每个产品的销售累计额: ``` Date: 2022-01-01 - Product: A - Sales: 100 - Cumulative Sales: 100 Date: 2022-01-02 - Product: A - Sales: 150 - Cumulative Sales: 250 Date: 2022-01-03 - Product: A - Sales: 120 - Cumulative Sales: 370 Date: 2022-01-01 - Product: B - Sales: 200 - Cumulative Sales: 200 Date: 2022-01-02 - Product: B - Sales: 250 - Cumulative Sales: 450 Date: 2022-01-03 - Product: B - Sales: 180 - Cumulative Sales: 630 ``` #### 4.4 复杂数据分析案例 除了基本的聚合分析外,窗口函数还可以进行更复杂的分析。例如,我们可以计算每天的销售额在所有产品中的占比。 ```python import psycopg2 # 数据库连接信息 conn = psycopg2.connect(database="your_database", user="your_username", password="your_password", host="your_host", port="your_port") cursor = conn.cursor() # 查询每天的销售额占比 cursor.execute("SELECT date, product, sales, sales * 100.0 / SUM(sales) OVER (PARTITION BY date) AS sales_percentage FROM sales_data") # 提取结果集 rows = cursor.fetchall() # 打印结果 for row in rows: print("Date: {} - Product: {} - Sales: {} - Sales Percentage: {}%".format(row[0], row[1], row[2], row[3])) # 关闭连接 cursor.close() conn.close() ``` 执行以上代码,将会输出每天的销售额在所有产品中的占比: ``` Date: 2022-01-01 - Product: A - Sales: 100 - Sales Percentage: 33.333333333333336% Date: 2022-01-01 - Product: B - Sales: 200 - Sales Percentage: 66.66666666666667% Date: 2022-01-02 - Product: A - Sales: 150 - Sales Percentage: 37.5% Date: 2022-01-02 - Product: B - Sales: 250 - Sales Percentage: 62.5% Date: 2022-01-03 - Product: A - Sales: 120 - Sales Percentage: 40.0% Date: 2022-01-03 - Product: B - Sales: 180 - Sales Percentage: 60.0% ``` ### 5. 窗口函数优化技巧 窗口函数的性能考虑和优化是进行高效数据分析的重要方面。在处理大规模数据和复杂计算任务时,合理使用窗口函数的优化策略可以大幅提升计算效率和节约资源。本章将介绍一些常用的窗口函数优化技巧,并提供示例与实践。 #### 5.1 窗口函数的性能考虑 在使用窗口函数进行数据分析时,需要注意以下性能考虑: - 数据量问题:窗口函数的计算涉及到对数据集中的某个窗口进行计算,因此数据量的大小会直接影响计算的耗时。如果数据量较大,可以考虑对数据进行分区处理,以减小每个窗口的计算量。 - 窗口范围问题:窗口函数的窗口范围是根据当前行的位置和窗口定义进行确定的。如果窗口范围过大,会导致计算复杂度增加,从而降低计算效率。因此,需要根据实际需求调整窗口范围的大小。 - 窗口排序问题:窗口函数通常需要对窗口内的数据进行排序操作,以便进行排名、排序和移动平均等分析。在排序过程中,需要注意选择合适的排序算法和数据结构,以提高排序的效率。 - 窗口分组问题:窗口函数可以根据指定的分组键进行分组操作,以实现数据的分组统计和聚合分析。在分组过程中,需要注意选择合适的分组键和分区策略,以减小分组的计算量。 #### 5.2 窗口函数优化策略 针对窗口函数的性能考虑,可以采取以下优化策略: - 分区优化:对数据进行合理的分区处理,将数据拆分成多个小的分区,以降低每个窗口的计算复杂度。可以根据数据的特点和窗口函数的需求进行分区策略的选择,比如按时间、地区、用户等进行分区。 - 窗口范围控制:根据实际需求合理设置窗口的大小和偏移量,避免窗口范围过大导致计算复杂度的增加。可以通过调整窗口大小、变更窗口类型等方式进行优化。 - 排序算法选择:窗口函数涉及到对窗口内数据的排序操作,选择合适的排序算法和数据结构进行优化。常见的排序算法有快速排序、归并排序、堆排序等,可以根据数据量和性能需求进行选择。 - 分组优化:对于需要分组操作的窗口函数,合理选择分组键和分区策略,以降低分组的计算复杂度。可以使用哈希分区、范围分区等策略进行优化。 #### 5.3 示例与实践 下面通过示例代码展示窗口函数的优化实践: ```python # 示例1:分区优化 data = spark.read.csv("data.csv") data.createOrReplaceTempView("data_view") result = spark.sql("SELECT name, age, salary, ROW_NUMBER() OVER(PARTITION BY name ORDER BY salary DESC) as rank FROM data_view") result.show() # 示例2:窗口范围控制 result = spark.sql("SELECT name, age, salary, ROW_NUMBER() OVER(ORDER BY salary DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as rank FROM data_view") result.show() # 示例3:排序算法选择 result = spark.sql("SELECT name, age, salary, ROW_NUMBER() OVER(ORDER BY salary DESC) as rank FROM data_view ORDER BY salary DESC") result.show() # 示例4:分组优化 result = spark.sql("SELECT category, product, count(*) OVER(PARTITION BY category ORDER BY product) as count FROM data_view") result.show() ``` 上述示例中,展示了分区优化、窗口范围控制、排序算法选择和分组优化等窗口函数的优化策略,并通过Spark SQL的代码示例进行了实践。通过灵活运用这些优化技巧,可以显著提升窗口函数的计算效率。 ### 综上所述,窗口函数的优化技巧是进行高效数据分析的重要手段之一。合理考虑窗口函数的性能问题,采取适当的优化策略,可以提升数据分析的速度和效果,从而提高工作效率和数据洞察力。在未来的发展中,随着技术的不断进步和窗口函数的优化策略的不断完善,窗口函数在数据分析领域将发挥更大的作用。 ### 6. 结论与展望 窗口函数在数据分析中扮演着至关重要的角色,通过窗口函数,我们可以进行更加高效和灵活的数据分析操作。随着数据分析技术的不断发展,窗口函数的应用也将会不断拓展和完善。 #### 6.1 窗口函数在高效数据分析中的价值 窗口函数可以帮助我们实现更加精细化的数据分析,对于复杂的数据处理需求提供了便利的解决方案。通过窗口函数,我们可以实现更加灵活和高效的数据分析操作,从而更好地挖掘数据的潜在价值。 #### 6.2 未来窗口函数发展趋势 随着大数据和人工智能技术的快速发展,窗口函数作为数据分析的重要利器,将会在未来得到更加广泛的应用。未来,窗口函数有望在数据处理速度、功能拓展、语法优化等方面得到进一步的提升和完善,为数据分析提供更加强大和便捷的工具支持。 这些趋势将为数据分析领域带来更多创新和突破,也将使窗口函数在数据分析中的地位更加重要和不可替代。 以上是对窗口函数在数据分析中的结论与未来展望,窗口函数的应用将会在数据分析领域发挥越来越重要的作用。
corwn 最低0.47元/天 解锁专栏
买1年送3月
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

LI_李波

资深数据库专家
北理工计算机硕士,曾在一家全球领先的互联网巨头公司担任数据库工程师,负责设计、优化和维护公司核心数据库系统,在大规模数据处理和数据库系统架构设计方面颇有造诣。
专栏简介
《SQL查询》专栏旨在帮助读者掌握SQL查询的基础知识和常用语法,并深入理解高级查询技巧。从基础概念和常用语法入手,专栏逐步展示了如何利用SQL进行数据过滤与排序、数据聚合和透视分析,以及多表关联和连接查询的方法。此外,还介绍了通过子查询优化数据检索、使用触发器实现数据自动化处理、利用存储过程提高查询性能等实用技巧。专栏还涵盖了数据库索引优化、事务处理与并发控制、窗口函数的应用以及复杂SQL查询的优化等高级内容。通过学习本专栏,读者将能够灵活运用SQL进行数据操作、优化查询性能,从而提高数据库的效率和可靠性。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

【代码分析神器的定制化扩展】:满足你的特定需求,独一无二!

![【代码分析神器的定制化扩展】:满足你的特定需求,独一无二!](https://www.aquasec.com/wp-content/uploads/2024/01/CVE_log4j_Picture1_OK.jpg) # 1. 代码分析工具的重要性与定制化扩展 在快速发展的IT行业中,代码分析工具作为提高代码质量和保障系统稳定性的重要手段,正变得日益不可或缺。它们不仅可以帮助开发者快速识别潜在的代码错误,还可以通过数据分析发现性能瓶颈,从而推动项目向更高效、更安全的方向发展。然而,标准的代码分析工具往往无法满足特定业务场景下的个性化需求,这就需要我们对现有的工具进行定制化扩展。定制化扩展

自适应控制新篇章:基于NMPC技术的研究突破

![自适应控制新篇章:基于NMPC技术的研究突破](https://controlautomaticoeducacion.com/wp-content/uploads/Copia-de-NMPC12-1024x576.png) # 摘要 非线性模型预测控制(NMPC)是一种先进的控制技术,它通过在每一控制步骤中求解一个在线优化问题,以实现对复杂非线性系统的有效控制。本文首先概述了NMPC技术的原理和理论基础,涵盖了动态系统的数学描述、优化原理及关键算法的设计。随后,文章探讨了NMPC在工业过程控制、机器人导航及智能交通系统等领域的实践应用。文中还分析了NMPC技术目前面临的挑战,包括高维系统

dnsub实战技巧:5分钟内快速识别子域名的秘诀

![子域名](https://tk-create.com/assets/images/subdomain01.png) # 摘要 dnsub是一款强大的子域名识别和挖掘工具,广泛应用于网络安全评估、Web应用测试和企业资产审计等领域。本文详细介绍了dnsub的简介、安装、配置、使用技巧、高级功能及定制化选项。文中还对dnsub的基础使用技巧和实战应用技巧进行了深入探讨,并提出了常见配置陷阱的解决方法。最后,文章展望了dnsub的未来发展和社区贡献的方向,强调了社区交流和技术贡献的重要性。 # 关键字 dnsub;子域名识别;网络安全评估;Web应用测试;企业资产审计;高级定制化功能 参考

【Coze工作流创意扩散法】:山海经故事的多角度解读与应用

![【Coze工作流创意扩散法】:山海经故事的多角度解读与应用](https://bandzoogle.com/files/4798/bzblog-4-top-ways-to-source-album-artwork-your-fans-will-love-main.jpeg) # 1. 山海经故事的历史与文化价值 ## 1.1 山海经的起源与历史背景 山海经是中国古代一部著名的地理神话集,大约成书于先秦时期,内容广泛涉及地理、生物、民族、神话、医药等众多领域。其起源可以追溯到远古时期人类对自然界的探索和想象,这些故事不仅记录了上古时期人们对世界的认知,还反映了古代人民的生活方式和思想信仰。

自动化更新:Windows Server 2012 R2上Defender for Endpoint安全更新的自动化管理

![自动化更新:Windows Server 2012 R2上Defender for Endpoint安全更新的自动化管理](https://4sysops.com/wp-content/uploads/2021/11/Actions-for-noncompliance-in-Intune-compliance-policy.png) # 摘要 本文旨在探讨Windows Server 2012 R2与Defender for Endpoint环境下自动化更新的理论基础与实践策略。文章首先概述了自动化更新的概念、重要性以及对系统安全性的影响。随后,详细介绍了Windows Server 2

【数据修复的未来】:2020Fixpng.zip引发的技术革新预览

![【数据修复的未来】:2020Fixpng.zip引发的技术革新预览](https://img-blog.csdnimg.cn/direct/327fde5aee0f46d1b2bc3bb3282abc53.png) # 摘要 随着信息技术的快速发展,数据修复技术在应对数据损坏事件中扮演了至关重要的角色。本文旨在探讨数据修复技术的演变、现状以及实践应用,并以2020Fixpng.zip事件为案例,分析数据损坏的多样性和复杂性以及应对这一挑战的技术策略。通过对数据修复理论基础的梳理,包括文件系统、算法原理和数据校验技术的讨论,以及对实用工具和专业服务的评估,本文提出了有效预防措施和数据备份策

【L298N H-Bridge电路的节能策略】:降低能耗与提升效率指南

# 摘要 本文针对L298N H-Bridge电路的能耗问题进行了深入研究,首先介绍了L298N H-Bridge电路的工作原理及节能设计原则,重点探讨了系统能耗的构成及其测量方法,并提出了能耗评估与优化目标。接着,文章详细阐述了降低能耗的多种策略,包括工作参数的调整、硬件优化措施以及软件控制算法的创新。文章进一步介绍了提升电路效率的实践方法,包括功率驱动优化、负载适应性调整以及可再生能源的整合。通过案例研究,展示了节能型L298N在实际应用中的节能效果及环境经济效益。最后,文章展望了L298N H-Bridge技术的未来发展趋势和创新研发方向,强调了新型材料、智能化整合及绿色制造的重要性。

【数据同步与处理能力大比拼】:Coze vs N8N vs Dify,谁的数据处理能力更胜一筹?

![Coze vs N8N vs Dify的区别](https://sapphireventures.com/wp-content/uploads/2021/01/low-code-no-code-blog-graphic-1024x576.png) # 1. 数据同步与处理平台概述 随着信息技术的迅速发展,数据同步与处理已经成为现代企业IT基础设施中的核心需求。企业需要确保其数据在多个系统和平台间能够高效、准确地同步,以支持实时决策、数据驱动的洞察以及业务流程的自动化。数据处理平台为这一挑战提供了多种解决方案,通过高度集成与自动化,这些平台能够简化数据同步与处理的复杂性,帮助企业保持竞争力

Coze开源项目维护升级:本地部署的长期管理之道

![Coze开源项目维护升级:本地部署的长期管理之道](https://media.licdn.com/dms/image/D4D12AQHx5PjIGInhpg/article-cover_image-shrink_720_1280/0/1681404001809?e=2147483647&v=beta&t=rzFjL2N2u71-zL5uNz9xrOcuAVsrS3gytDrulG3ipVM) # 1. Coze开源项目的理解与部署 ## 1.1 Coze开源项目简介 Coze是一个开源的项目,旨在为用户提供一个高效、灵活的代码编辑和管理平台。它通过现代化的用户界面和强大的功能集合,满

【许可证选择指南】:为你的开源项目挑选最适合的许可证

![【许可证选择指南】:为你的开源项目挑选最适合的许可证](https://www.murphysec.com/blog/wp-content/uploads/2023/01/asynccode-66.png) # 1. 开源许可证概述 ## 1.1 开源许可证的重要性 在当今开源软件发展的大环境下,许可证不仅是法律协议,更是软件开发和共享的基石。一个合适的许可证可以保护开发者的知识产权,同时鼓励他人合法使用、贡献和扩展代码。本章节将概述开源许可证的定义、功能和其在软件生态中的作用。 ## 1.2 许可证的定义和目的 开源许可证是一组法律条款,规定了第三方在何种条件下可以使用、修改和重新分