SQL中的Group By和Partition By场景:数据科学中何时及如何组合数据

SQL中的Group By和Partition By场景:数据科学中何时及如何组合数据

💡 原文英文,约1700词,阅读约需6分钟。
📝

内容提要

SQL的GROUP BY和PARTITION BY子句用于分组和聚合操作。GROUP BY按列分组并聚合数据,PARTITION BY按列分组并排序排名。这些功能在报表、分析、统计、数据清洗和群体分析中非常有用。

🔎

延伸解读

GROUP BY 与 PARTITION BY 的核心区别

GROUP BY 将每个分组压缩为一行,适合汇总统计;PARTITION BY 保留所有原始行,并在组内进行排序或计算。例如,要找出每个类别中销售额最高的书籍,使用 GROUP BY 会丢失书籍名称等明细,而 PARTITION BY 配合 row_number() 可以保留明细并标记排名。理解这一区别是选择正确子句的关键。

PARTITION BY 的典型应用场景

文章展示了 PARTITION BY 的多种用途:查找组内最高记录(如每类销量最高的书)、计算累积总和(如每个产品的运行总计)、比较组内值(如员工薪资与部门平均薪资对比)、将数据分为等份(如按薪资分成4组)以及识别数据中的间隙(如产品ID不连续)。这些场景在报表和分析中非常常见。

使用 GROUP BY 时注意聚合列与分组列

GROUP BY 子句要求分组列的值在组内相同,聚合列则应用聚合函数(如 SUM、COUNT、AVG)。聚合列不应与分组列相同,否则聚合无意义。此外,HAVING 子句用于对聚合结果进行过滤,例如查找重复客户名时,用 HAVING count(*) > 1 筛选出重复项。

组合使用解决复杂问题

实际分析中,GROUP BY 和 PARTITION BY 常结合使用。例如,先使用 PARTITION BY 计算组内排名,再在外层查询中筛选排名为1的记录,从而得到每组的最佳项。文章中的多个场景演示了这种嵌套查询的写法,帮助读者应对更复杂的报表需求。

❓

Q&A

SQL中GROUP BY和PARTITION BY的主要区别是什么?

GROUP BY将分组后的数据减少为每个组一行,并对其他列进行聚合操作;而PARTITION BY保留每一行,并对组内行进行排序和排名或聚合操作。

什么时候应该用GROUP BY而不是PARTITION BY?

当你需要将每个组汇总为单行(如计算总和、计数、平均值、最大值/最小值)时使用GROUP BY;当你需要保留原始行并添加排名或聚合列(如查找组内最高记录、计算累积总和)时使用PARTITION BY。

如何用GROUP BY找出表中的重复记录?

使用GROUP BY对可能重复的列(如姓名)分组,用COUNT(*)统计每组数量,并通过HAVING子句过滤计数大于1的组。例如:SELECT name, COUNT(*) AS duplicate_count FROM customers GROUP BY name HAVING COUNT(*) > 1;

PARTITION BY如何用于计算组内累积总和?

使用SUM()窗口函数,配合PARTITION BY按分组列(如product_id)分区,并按排序列(如date)排序,即可计算每个分区内的累积总和。例如:SELECT product_id, date, amount, SUM(amount) OVER (PARTITION BY product_id ORDER BY date) AS running_total FROM sales_data;

如何用PARTITION BY找出每个类别中销售额最高的记录?

使用ROW_NUMBER()窗口函数,按类别分区并按销售额排序,然后在外层查询中筛选出行号为1的记录。例如:SELECT category, book_name, amount FROM (SELECT category, book_name, amount, ROW_NUMBER() OVER (PARTITION BY category ORDER BY amount DESC) AS sales_rank FROM book_sales) AS ranked WHERE sales_rank = 1;

PARTITION BY如何用于将数据划分为等大小的组?

使用NTILE(n)窗口函数,按排序条件(如salary DESC)将数据划分为n个大致相等的组,并为每行分配一个组号(tile_id)。例如:SELECT employee_id, salary, NTILE(4) OVER (ORDER BY salary DESC) AS tile_id FROM employees;

GROUP BY和PARTITION BY在数据清洗中有什么作用?

GROUP BY可用于识别重复项(通过计数和HAVING过滤),PARTITION BY可用于识别数据中的间隙或异常(如通过行号与序列值的差检测不连续),两者都有助于数据清洗和质量提升。

🏷️

标签

➡️

继续阅读