欢迎投稿

今日深度:

MySQL窗口函数over(partitionby)的用法,

MySQL窗口函数over(partitionby)的用法,


目录
  • 概念
  • 语法
  • 需求案例:按 orderId 然后从每组取出 lastUpdateTime 最大的一条纪录
    • 另一种实现 利用substring_index 取某个字段
  • PARTITION BY与GROUP BY区别

    概念

    开窗函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化

    语法

    row_number() over(partition by 分组列 order by 排序列 desc) as rowno
    
    rank() over(partition by 分组列 order by 排序列 desc) as rowno
    
    dense_rank() over(partition by 分组列 order by 排序列 desc) as rowno
    

    row_number()是对行的排序编号:不重复:1,2,3,4,5,6
    rank()是对行的排序编号:会重复,总数不变:1,1,3,3,5,6
    dense_rank()是对行的排序编号:会重复,总数减少:1,1,2,2,3,4

    row number() + over()中添加partition by 则表示按照对象分组后排序编号

    在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by,但不晚于 order by 的执行。

    需求案例:按 orderId 然后从每组取出 lastUpdateTime 最大的一条纪录

    SELECT  *  FROM
     ( SELECT *, ROW_NUMBER () OVER (PARTITION BY orderId  ORDER BY lastUpdateTime DESC) rn 
    		FROM tableName	) t        
    WHERE t.rn <= 1
    

    另一种实现 利用substring_index 取某个字段

    这里实现是通过对相应字段分组,然后通过group_concat函数将 orderId 字段按照更新时间lastUpdateTime 字段排序并连接成一个字符串,group函数默认的缺省值是按照逗号分割,最后通过subString_index函数分割逗号并调用第一个

    SELECT orderId,
    SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY lastUpdateTime DESC ),',',1) status
    FROM tableName	
    GROUP BY orderId
    

    PARTITION BY与GROUP BY区别

    group by是分组函数,partition by是分析函数

    在执行顺序上:from > where > group by > having > order by,而partition
    by应用在以上关键字之后,可以简单理解为就是在执行完select之后,在所得结果集之上进行partition by分组

    partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序,而group
    by则只保留参与分组的字段和聚合函数的结果

    官方文档:https://dev.mysql.com/doc/refman/8.0/en/window-functions.html

    优质解析:

    https://blog.csdn.net/weixin_51146329/article/details/127856341

    https://blog.csdn.net/ZYC88888/article/details/129676229

    到此这篇关于MySQL窗口函数 over(partition by)的用法的文章就介绍到这了,更多相关MySQL over(partition by)内容请搜索PHP之友以前的文章或继续浏览下面的相关文章希望大家以后多多支持PHP之友!

    您可能感兴趣的文章:
    • mysql中over partition by的具体使用
    • MySQL窗口函数OVER使用示例详细讲解
    • MySQL窗口函数OVER()用法及说明

    www.htsjk.Com true http://www.htsjk.com/Mysql/47467.html NewsArticle MySQL窗口函数over(partitionby)的用法, 目录 概念 语法 需求案例:按 orderId 然后从每组取出 lastUpdateTime 最大的一条纪录 另一种实现 利用substring_index 取某个字段 PARTITION BY与GROUP BY区别 概念...
    评论暂时关闭