MySQL提供了一些开窗函数来对查询结果进行分组和排序。
1. ROW_NUMBER()函数:用于为结果集中的每一行生成一个唯一的行号。语法:ROW_NUMBER() OVER (ORDER BY column_name)。例如:
```
SELECT ROW_NUMBER() OVER (ORDER BY age) AS row_num, name, age FROM users;
```
2. RANK()函数:用于为结果集中的每一行生成一个排名。如果存在并列的值,该函数会跳过相等的排名。语法:RANK() OVER (ORDER BY column_name)。例如:
```
SELECT RANK() OVER (ORDER BY score DESC) AS ranking, name, score FROM students;
```
3. DENSE_RANK()函数:与RANK()函数类似,用于为结果集中的每一行生成一个排名。不同之处在于,即使存在并列的值,该函数也会连续产生排名。语法:DENSE_RANK() OVER (ORDER BY column_name)。例如:
```
SELECT DENSE_RANK() OVER (ORDER BY price) AS ranking, product_name, price FROM products;
```
4. NTILE()函数:将结果集分成指定数量的桶(bucket),并为每个桶中的行分配桶号。语法:NTILE(num_buckets) OVER (ORDER BY column_name)。例如:
```
SELECT NTILE(4) OVER (ORDER BY salary) AS bucket, name, salary FROM employees;
```
5. LAG()函数和LEAD()函数:用于访问结果集中的前一个(LAG)或后一个(LEAD)行的数据。这两个函数可以根据指定的排序规则来访问数据。语法:LAG(column_name, offset) OVER (ORDER BY column_name)和LEAD(column_name, offset) OVER (ORDER BY column_name)。例如:
```
SELECT name, salary, LAG(salary) OVER (ORDER BY salary) AS previous_salary FROM employees;
SELECT name, salary, LEAD(salary) OVER (ORDER BY salary) AS next_salary FROM employees;
```
注意:以上的示例中,都使用了一个OVER子句来指定排序规则。这个子句可以包含ORDER BY子句来定义排序的列,也可以包含PARTITION BY子句来按照指定的列进行分组。
网友评论