SQL 分区是与窗口函数一起使用的特性,用于将行分组以进行计算,同时保留单个行详细信息。 当您使用 PARTITION BY
子句应用分区时,您会根据指定的列将数据集划分为子集。 与 GROUP BY
(将行折叠为聚合摘要)不同,分区允许您在每个组中执行计算(例如,总和、平均值或排名),而无需合并行。 这使得分区非常适合需要比较或分析子组内的数据,但仍需要访问原始行级别信息的任务。
例如,考虑一个具有 employee_id
、sale_date
和 amount
列的销售表。 为了计算每个员工随时间推移的总销售额,而不会丢失单个交易明细,您可以编写
SELECT employee_id, sale_date, amount,
SUM(amount) OVER (PARTITION BY employee_id ORDER BY sale_date) AS running_total
FROM sales;
在这里,PARTITION BY employee_id
按每个员工对行进行分组。 SUM(amount)
计算每个员工销售额的累计总额(running_total
),按日期排序。 每行都保留其原始数据,但包括特定于员工的运行总计。 类似地,像 RANK()
或 ROW_NUMBER()
这样的函数可以与分区一起使用,以在组内分配排名,例如识别每个地区或月份表现最佳的销售额。
分区在诸如计算移动平均值、对类别中的结果进行排名或将各个行与组平均值进行比较之类的场景中非常有用。 它们简化了否则需要复杂的自连接或子查询的查询。 例如,无需编写多个子查询来计算部门特定的平均值,只需使用带有 PARTITION BY department
的单个窗口函数即可有效地实现此目的。 可以通过索引分区列来优化性能,因为数据库必须对每个子集进行排序和处理。 但是,对大型数据集进行过度分区可能会影响速度,因此平衡粒度和效率是关键。 总体而言,分区提供了一种灵活的方式来执行上下文相关的计算,同时保留数据粒度。