PARTITION BY子句用于将表的行划分为组。当我们必须使用该组的其他行对组的各个行执行计算时,它很有用。
- 它总是在 OVER() 子句中使用。
- 由 partition 子句形成的分区也称为Window 。
- 该子句仅适用于 Windows 函数。喜欢 – RANK(), LEAD(), LAG() 等。
- 如果在 OVER() 子句中省略了该子句,则整个表被视为单个分区。
句法:
Partition 子句的语法是-
Window_function ( expression )
Over ( partition by expr [order_clause] [frame_clause] )
在这里,order_clause 和 frame_clause 是可选的。
expr可以是列名或 MySQL 中的内置函数。
但是,标准 SQL 只允许 expr 中的列名。
例子:
考虑一个表“黑客”:
h_id | h_name | challenge_id | score |
---|---|---|---|
3 | shubh | 111 | 20 |
2 | aayush | 111 | 80 |
5 | krithik | 112 | 40 |
5 | krithik | 114 | 90 |
4 | tushar | 112 | 30 |
1 | parth | 112 | 40 |
我们必须在每个挑战中找到黑客的排名。这意味着我们必须列出所有参与挑战的黑客以及他们在该挑战中的排名。
询问:
select challenge_id, h_id, h_name, score,
dense_rank() over ( partition by challenge_id order by score desc )
as "rank", from hacker;
解释:
在上面的查询中, partition by子句将表划分为具有相同challenge_id 的组。
order by将按“分数”降序排列每个分区的黑客。
over()子句定义了如何对表的行进行分区和排序,这些行将由窗口函数rank() 处理。
Dense_rank()是一个窗口函数,它将在挑战的有序分区中分配排名。如果两个黑客有相同的分数,那么他们将被分配相同的等级。
输出:
challenge_id | h_id | h_name | score | rank | 111 | 2 | aayush | 80 | 1 |
---|---|---|---|---|
111 | 3 | shubh | 20 | 2 |
112 | 5 | krithik | 40 | 1 |
112 | 1 | parth | 40 | 1 |
112 | 4 | tushar | 30 | 2 |
114 | 5 | krithik | 90 | 1 |
因此,我们获得了所有黑客的列表以及他们在各个挑战中的排名。