在MySQL中,PARTITION BY
子句用于在OVER()
子句中对查询结果进行分区,以便对每个分区应用窗口函数,如RANK()
, LEAD()
, LAG()
等。PARTITION BY
子句与GROUP BY
子句的主要区别在于,PARTITION BY
在查询结果集上执行分区,而GROUP BY
在原始数据上执行分组。
以下是PARTITION BY
的基本用法:
- 基本语法 :
Window_function (expression) OVER (
PARTITION BY expr [
ORDER BY clause [
FRAME_CLAUSE
]
]
)
-
expression
:要应用窗口函数的表达式,可以是列名或内置函数。 -
PARTITION BY expr
:指定要根据哪个列进行分区。 -
ORDER BY clause
(可选):指定分区内的行排序方式。 -
FRAME_CLAUSE
(可选):定义窗口的范围。
-
与
GROUP BY
的区别 :
-
GROUP BY
是在原始数据上执行分组,通常与聚合函数(如COUNT()
,SUM()
,AVG()
)一起使用。 -
PARTITION BY
是在查询结果集上执行分区,可以保留所有数据,并对其中某些字段进行分组排序。
- 示例 :
-- 查询每种型号火车的ID、型号、一等座数量、同型号一等座数量总量
SELECT id, model, first_class_places,
COUNT(id) OVER (PARTITION BY model) AS total_first_class_seats
FROM train
- 注意事项 :
-
PARTITION BY
子句必须与OVER()
子句一起使用。 -
PARTITION BY
子句中的表达式可以是列名,也可以是内置函数。 -
PARTITION BY
子句创建的分区也称为窗口。
希望这些信息能帮助你理解MySQL中PARTITION BY
的用法。