mysql 窗口函数最新一条_MySQL 8.0 窗口函数(window functions)

窗口函数(window functions)是数据库的标准功能之一,主流的数据库比如Oracle,PostgreSQL都支持窗口函数功能,MySQL 直到 8.0 版本才开始支持窗口函数。

窗口函数,简单来说就是对于一个查询SQL,将其结果集按指定的规则进行分区,每个分区可以看作是一个窗口,分区内的每一行,根据其所属分区内的行数据进行函数计算,获取计算结果,作为该行的窗口函数结果值。

窗口函数与group聚合查询类似,都是对一组(分区)记录进行计算,区别在于group对一组记录计算后返回一条记录作为结果,而窗口函数对一组记录计算后,这组记录中每条数据都会对应一个结果。

来看一个例子:

mysql> SELECT

year, country, product, profit,

SUM(profit) OVER() AS total_profit,

SUM(profit) OVER(PARTITION BY country) AS country_profit

FROM sales

ORDER BY country, year, product, profit;

+------+---------+------------+--------+--------------+----------------+

| year | country | product | profit | total_profit | country_profit |

+------+---------+------------+--------+--------------+----------------+

| 2000 | Finland | Computer | 1500 | 7535 | 1610 |

| 2000 | Finland | Phone | 100 | 7535 | 1610 |

| 2001 | Finland | Phone | 10 | 7535 | 1610 |

| 2000 | India | Calculator | 75 | 7535 | 1350 |

| 2000 | India | Calculator | 75 | 7535 | 1350 |

| 2000 | India | Computer | 1200 | 7535 | 1350 |

| 2000 | USA | Calculator | 75 | 7535 | 4575 |

| 2000 | USA | Computer | 1500 | 7535 | 4575 |

| 2001 | USA | Calculator | 50 | 7535 | 4575 |

| 2001 | USA | Computer | 1200 | 7535 | 4575 |

| 2001 | USA | Computer | 1500 | 7535 | 4575 |

| 2001 | USA | TV | 100 | 7535 | 4575 |

| 2001 | USA | TV | 150 | 7535 | 4575 |

+------+---------+------------+--------+--------------+----------------+

查询SQL通过 OVER 子句来标记窗口,OVER 子句中的内容可以指定窗口分区的方法。

上述例子中,第一个 OVER 子句中的参数为空,则将整个查询结果集作为一个单一的分区,分区内的每条记录的窗口函数计算结果为整个分区内的字段值求和。

第二个 OVER子 句使用 country 字段作为参数,对查询结果集进行分区,按照 country 分区,分区内求和,作为该分区内每条记录的窗口函数计算结果。

二、窗口函数语法

over_clause:

{OVER (window_spec) | OVER window_name}

window_spec:

[window_name] [partition_clause] [order_clause] [frame_clause]

partition_clause:

PARTITION BY expr [, expr] ...

order_clause:

ORDER BY expr [ASC|DESC] [, expr [ASC|DESC]] ...

如果 OVER() 子句里面的内容为空,则窗口大小为整个查询的结果集,使用结果集中的所有记录计算结果。

如果 OVER() 子句里面的内容不为空,则使用里面指定的窗口分区规则、排序规则对分区内的记录进行分区和排序。

partition_clause,指定如何对查询结果集进行分区,窗口函数基于分区内的记录进行计算,如果没有指定 partition_clause 子句,则对整个查询结果集数据进行计算。SQL标准要求 PARTITION BY 后面只能跟字段名,MySQL扩展支持表达式,比如ts字段为TIMESTAMP类型,可以这样使用PARTITION BY HOUR(ts)。

order_clause,可选,后面可以跟 ASC 或者 DESC 指定排序方向。order by 子句对分区内的记录进行排序。

frame_clause,表示当前分区的一个子集,frame_clause 指定了定义当前分区子集的方法。

三、命名的窗口

窗口函数的窗口能够使用指定的名称来定义,然后可以在 OVER 子句中使用指定的名称来引用窗口。

举个例子,未使用命名窗口的窗口函数如下:

SELECT

val,

ROW_NUMBER() OVER (ORDER BY val) AS 'row_number',

RANK() OVER (ORDER BY val) AS 'rank',

DENSE_RANK() OVER (ORDER BY val) AS 'dense_rank'

FROM numbers;

使用命名窗口改写,如下:

SELECT

val,

ROW_NUMBER() OVER w AS 'row_number',

RANK() OVER w AS 'rank',

DENSE_RANK() OVER w AS 'dense_rank'

FROM numbers

WINDOW w AS (ORDER BY val);

使用命名的窗口,SQL更加清晰、简洁,更容易测试窗口的定义,如果要修改窗口的定义,只需要修改WINDOW子句,而不必每个OVER子句都修改。

四、非聚合类窗口函数

MySQL支持的非聚合类窗口函数如下:

CUME_DIST()

DENSE_RANK()

FIRST_VALUE() LAG()

LAST_VALUE()

LEAD() NTH_VALUE()

NTILE()

PERCENT_RANK()

RANK() ,

ROW_NUMBER()

举个例子,通过ROW_NUMBER()函数,计算每条记录在其所在分区内的行号。默认条件下,分区内的记录是未排序的,因此行号也是不确定的,可以使用 order by 子句对窗口函数定义的分区内的数据集进行排序。下面例子 row_num1 未排序,row_num2 排序。

mysql> SELECT

year, country, product, profit,

ROW_NUMBER() OVER(PARTITION BY country) AS row_num1,

ROW_NUMBER() OVER(PARTITION BY country ORDER BY year, product) AS row_num2

FROM sales;

+------+---------+------------+--------+----------+----------+

| year | country | product | profit | row_num1 | row_num2 |

+------+---------+------------+--------+----------+----------+

| 2000 | Finland | Computer | 1500 | 2 | 1 |

| 2000 | Finland | Phone | 100 | 1 | 2 |

| 2001 | Finland | Phone | 10 | 3 | 3 |

| 2000 | India | Calculator | 75 | 2 | 1 |

| 2000 | India | Calculator | 75 | 3 | 2 |

| 2000 | India | Computer | 1200 | 1 | 3 |

| 2000 | USA | Calculator | 75 | 5 | 1 |

| 2000 | USA | Computer | 1500 | 4 | 2 |

| 2001 | USA | Calculator | 50 | 2 | 3 |

| 2001 | USA | Computer | 1500 | 3 | 4 |

| 2001 | USA | Computer | 1200 | 7 | 5 |

| 2001 | USA | TV | 150 | 1 | 6 |

| 2001 | USA | TV | 100 | 6 | 7 |

+------+---------+------------+--------+----------+----------+

另外一个例子,CUME_DIST() 函数,计算分区内,小于等于当前值的记录数占分区内总记录数的比值,取值范围为0~1。示例如下:

mysql> SELECT

val,

ROW_NUMBER() OVER w AS 'row_number',

CUME_DIST() OVER w AS 'cume_dist',

PERCENT_RANK() OVER w AS 'percent_rank'

FROM numbers

WINDOW w AS (ORDER BY val);

+------+------------+--------------------+--------------+

| val | row_number | cume_dist | percent_rank |

+------+------------+--------------------+--------------+

| 1 | 1 | 0.2222222222222222 | 0 |

| 1 | 2 | 0.2222222222222222 | 0 |

| 2 | 3 | 0.3333333333333333 | 0.25 |

| 3 | 4 | 0.6666666666666666 | 0.375 |

| 3 | 5 | 0.6666666666666666 | 0.375 |

| 3 | 6 | 0.6666666666666666 | 0.375 |

| 4 | 7 | 0.8888888888888888 | 0.75 |

| 4 | 8 | 0.8888888888888888 | 0.75 |

| 5 | 9 | 1 | 1 |

+------+------------+--------------------+--------------+

五、聚合类窗口函数

窗口函数的 OVER 子句可以和许多聚合函数一起使用,这些聚合函数加上 OVER 子句,就是窗口函数,如果不加 OVER 子句,就是普通的聚合函数。支持窗口函数功能的聚合函数如下:

AVG()

BIT_AND()

BIT_OR()

BIT_XOR()

COUNT()

JSON_ARRAYAGG()

JSON_OBJECTAGG()

MAX()

MIN()

STDDEV_POP(), STDDEV(), STD()

STDDEV_SAMP()

SUM()

VAR_POP(), VARIANCE()

VAR_SAMP()

本文开头的第一个例子,就是使用SUM()聚合函数做窗口计算的,可以翻回去看一下。

六、窗口函数的使用限制

SQL标准加在窗口函数上的一个限制是不能用于update和delete语句来更新行记录。在update和delete语句的子查询中使用窗口函数是允许的。

不支持聚合窗口函数的 DISTINCT 语法

不支持嵌套的窗口函数

不支持依赖于当前行值的动态帧结束点

指定 GROUPS 帧单元能够被解析,但是会产生错误,仅支持 ROWS 和 RANGE

指定帧的 EXCLUDE 子句能够被解析,但是会产生错误

IGNORE NULLS 子句能够被解析,但是会产生错误,目前只支持 RESPECT NULLS 子句

FROM LAST 子句能够被解析,但是会产生错误,目前只支持 FROM FIRST 子句

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《人类简史》作者:应对 AI 革命,要打造新的经济、社会和教育体系

来源:36氪 概要:正在进行的人工智能革命将改变几乎所有的工作,给社会和经济的发展带来机遇和挑战。一些人认为,人工智能将把人类赶出就业市场,创造一个新的“无用的阶层”;另一些人则认为,自动化…

php mysql 胚子_php mysql数据库连接浅识

1、连接数据库连接函数:a、mysql_connect() :函数打开非持久的 MySQL 连接b、mysql_pconnect() :函数打开持久的MySQL 连接mysql_connect()格式:mysql_connect(server,user,pwd,newlink,clientflag)注:脚本一结束&…

全球厂商已向自动驾驶投入800亿美元 依然群龙无首 | 厚势

来源: 腾讯科技 概要:近日发表的一份权威研究报告指出,全球厂商已经在自动驾驶领域投资 800 亿美元,但是迄今为止,仍然没有一家明显处于领先优势的厂商。 自动驾驶和电动车成为当下科技行业两大热点之一,几…

promise的状态值_什么是Promise,Promise的三种状态

什么是Promise对象:Js中进行异步编程的新的解决方案,用于表示一个异步操作的最终完成 (或失败), 及其结果值.。语法上:promise是一个构造函数简单来说,promise对象用来封装一个异步操作并可以获取其结果语法:new Promi…

埃森哲报告:2017年数字化浪潮下的医疗行业五大趋势

来源:AI掘金志 概要:日前,埃森哲发布了《2017年数字化健康技术展望》报告,分析了数字化浪潮下的医疗护理行业的实际落地情况和发展前景,主要围绕着AI、生态系统建设、新型医疗人才挖掘、新的监督法规等五个方面进行解…

python修改xpath节点_Xpath python在特定文本后查找节点

这里是HTML代码:Specific text 1link1 inside specific text 1link2 inside specific text 1link3 inside specific text 1Specific text 2link1 inside specific text 2link2 inside specific text 2link3 inside specific text 2link4 inside specific text 2Spec…

人类如何从不同角度识别物体?你需要对「小样本学习」有所了解

来源:转载自公众号「雷克世界」微信号:ROBO_AI 编译:嗯~阿童木呀、多啦A亮 概要:在视觉层次结构的较低层次,不变性使你可以识别矩形或线条,即使它是倾斜、旋转或缩放的;而在更高的层次上&#x…

python链表和树实验报告_关于Python实现树结构和链表结构的一点想法

关于Python实现树结构和链表结构的一点想法Python由于内置的数据结构具有很高的灵活性,所以可以用很多种方式来构建树、图、链表等结构1. 树的Python实现python自然可以使用class来创建Node结点类和Trie类,然后通过left和right属性保存Node结点来实现树P…

摩尔定律已死?GPU会取代CPU的位置吗?

来源:全球人工智能 概要:CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。 京举办的NVIDIA GTC China会议中,无论是AI智能运算,还是服务器数据中心、智能城市&#xff…

mysql 终端模拟_mysql客户端模拟脏读、幻读和可重复读

如果操作一下时报出错误:在数据库中执行 SET GLOBAL BINLOG_FORMAT mixed;执行后可通过SELECT * FROM information_schema.GLOBAL_VARIABLES WHERE VARIABLE_NAME ‘BINLOG_FORMAT’ ;进行查看。通过客户端选择可用数据库:use db_test(模拟数据库)以下…

Nature Human Behavior:大脑对不公平的反应有助预测抑郁症

来源:生物帮、神经科技 概要:过去的研究已经表明,财富分配不均,即经济不平等,可能会促进抑郁症等精神疾病的增加。但是,这背后的机制却不为人知。 2017年10月2日,国际学术权威刊物自然出版集团旗…

mysql创建table w3c_MySQL ALTER命令

MySQL ALTER命令当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。开始本章教程前让我们先创建一张表,表名为:testalter_tbl。 roothost# mysql -u root -p password;Enter password:mysql> use W3CSCHOOL;Datab…

这几家公司有个梦想:开发AI操作系统,让外行也成为人工智能大师

来源:科技行者 概要:未来几年人工智能会如何发展?除了阿尔法狗令人叹为观止的表现,人工智能确实也正在改变整个行业。但有一点我们是需要注意的,有必要让AI从总体上变得更加易于使用。 严格的说,Scot Barto…

mysql耦合_内聚与耦合

简单理解一下内聚和耦合。什么是模块模块就是从逻辑上将系统分解为更细微的部分,分而治之。复杂问题因为复杂性的问题,比较难解决,但是可以将复杂问题拆解为若干简单问题,逐个击破地解决这些简单问题,最后实现解决复杂…

mysql3.51 密码修改_mysql修改密码

刚初始化的数据库要做的步骤1 为root设置了密码2 删除默认用户3 删除默认的test库修改密码的方法1为管理员设置密码(开始没密码)mysqladmin -uroot password 12qwaszx;2 修改密码方法一: mysqladmin管理工具 (推荐使用)mysqladmin -uroot -p12qwaszx password c110123;注意有空…

Google CEO Sundar Pichai :“谷歌最大的威胁就是自身的成功”

作者:Dude 概要:10月9日,低调的皮柴哥接受了英国卫报的访问,在访谈期间,他分享了谷歌在人工智能上发展,也表达了对谷歌近年来发展的隐忧。 10月9日,低调的皮柴哥接受了英国卫报的访问&#xff0…

python自动客服排班_使用或工具的护士排班问题,在某些日子增加不同的轮班时间...

我正在从here修改代码,我希望能够为某一天添加不同长度的轮班(例如,我希望星期五/第4天只有2个轮班)。我的代码总是以错误代码结尾。我相信这是由于我设定的一些限制的内部问题。在我在类似的程序上看到了一些关于StackOverflow的帖子,但是找…

国防科技大学教授:殷建平——计算机科学理论的过去、现在与未来

来源:图灵人工智能殷建平 教授,博士生导师,国防科学技术大学计算机系主任。研究方向有:模式识别与人工智能、网络算法与信息安全。享受国务院政府特殊津贴。2015年被评为“万人计划”国家级教学名师。2009年被评为“全国优秀教师”…

cmd上打开mysql_cmd连接mysql的方法

连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车)创建授权:grant select on 数据库.* to 用户名登录主机 identified by \"密码\"修改密码:my…

《自然》杂志:关于人类未来的工作,有三个最紧迫的问题

来源:36氪 概要:机器学习会淘汰工人吗?零工经济(Gig Economy)会增加对工人的剥削吗?技能的差距能够弥补吗? 机器学习会淘汰工人吗?零工经济(Gig Economy)会增…