当前位置 : 主页 > 编程语言 > java >

MySQL8数据库窗口函数

来源:互联网 收集:自由互联 发布时间:2022-06-23
对于窗口函数,比如row_number(),rank(),dense_rank(),NTILE(),PERCENT_RANK()等等,现在MySQL8版本已经支持了。 row_number()(分组)排序编号 row_number()over(partition by user_no order by create_date desc) as row

对于窗口函数,比如row_number(),rank(),dense_rank(),NTILE(),PERCENT_RANK()等等,现在MySQL8版本已经支持了。

row_number()(分组)排序编号 row_number()over(partition by user_no order by create_date desc) as row_num,按照用户分组,按照create_date排序,对已有数据生成一个编号。
  当然也可以不分组,对整体进行排序。任何一个窗口函数,都可以分组统计或者不分组统计(也即可以不要partition by 都可以,看需求)

row_number()over(partition by user_no order by create_date desc) as row_num

rank()
  类似于 row_number(),也是排序功能,但是rank()有什么不一样?新的事物的出现必然是为了解决潜在的问题。
  如果再往测试表中写入一条数据:insert into order_info values (11,’u0002’,800,’2018-1-22’);
  对于测试表中的U002用户来说,有两条create_date完全一样的数据(假设有这样的数据),那么在row_number()编号的时候,这两条数据却被编了两个不同的号
  理论上讲,这两条的数据的排名是并列最新的。因此rank()就是为了解决这个问题的,也即:排序条件一样的情况下,其编号也一样。

dense_rank()
  dense_rank()的出现是为了解决rank()编号存在的问题的,
  rank()编号的时候存在跳号的问题,如果有两个并列第1,那么下一个名次的编号就是3,结果就是没有编号为2的数据。
  如果不想跳号,可以使用dense_rank()替代。


上一篇:最快的分布式关系型数据库MEMSQL
下一篇:没有了
网友评论