mysql 的开窗函数

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子句来按照指定的列进行分组。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一,开窗函数: 开窗函数:为将要被操作的行的集合定义一个窗口,它对一组值进行操作,不需要使用GROUP BY子句对...
    weiwei_js阅读 14,045评论 1 9
  • 1. 介绍 普通聚合函数聚合的行集是组,开窗函数聚合的行集是窗口。因此,普通聚合函数每组(Group by)只有一...
    幸运猪x阅读 8,210评论 0 4
  • 1. 介绍 普通聚合函数聚合的行集是组,开窗函数聚合的行集是窗口。因此,普通聚合函数每组(Group by)只有一...
    Yobhel阅读 587评论 0 2
  • 分析函数,也称为窗口函数,通常被认为仅对数据仓库SQL有用。使用分析函数的查询,基于对数据行的分组来计算总量值。与...
    猫猫_tomluo阅读 3,377评论 3 18
  • 一般的商业数据库(其实也就是DB2,Oracle,SQL Server)都具备窗口函数这个功能,只不过名称不同,我...
    花讽院_和狆阅读 1,585评论 2 1