MYSQL的窗口函数

Posted 人类反叛军

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL的窗口函数相关的知识,希望对你有一定的参考价值。

窗口函数与group by很相似,但是over()可以保留原始数据,如计算某行业的股价平均值时,一般情况下会使用查询,代码如下:

WITH industry as ( SELECT `code`,code_name as `name`,`industry`  FROM `baostock_industry`  WHERE industry IN ('银行','非银金融' ) -- 临时表,为减少数据量 )SELECT DISTINCT a.`date`,a.`code`,a.`close`,industry.`name`,`industry`.`industry` ,ROUND((SELECT avg(a.`close`) from `baostock_daily` as a ,industry  WHERE a.`code`=industry.`code` AND a.date>='20210629'),2) AS avg_close  FROM `baostock_daily` as a ,industry  WHERE a.`code`=industry.`code` AND a.date>='20210629';

结果如下:

代码比较冗余其实这时我们可以使用over()函数,一样可以达到同样的效果,具体代码如下:

WITH industry as ( SELECT `code`,code_name as `name`,`industry`  FROM `baostock_industry`  WHERE industry IN ('银行','非银金融' ) -- 临时表,为减少数据量 )SELECT DISTINCT a.`date`,a.`code`,a.`close`,industry.`name`,`industry`.`industry`  ,round(avg(a.`close`over() ,2AS avg_close  FROM `baostock_daily` as a ,industry  WHERE a.`code`=industry.`code` AND a.date>='20210629';

而且在over()中可以使用partition by进行组内平均值的计算,具体代码如下:

WITH industry as ( SELECT `code`,code_name as `name`,`industry`  FROM `baostock_industry`  WHERE industry IN ('银行','非银金融' ) -- 临时表,为减少数据量 )SELECT DISTINCT a.`date`,a.`code`,a.`close`,industry.`name`,`industry`.`industry` ,round(avg(a.`close`) over(partition BY `industry`.`industry` order by `date` DESC,`code` DESC) ,2) AS avg_close  FROM `baostock_daily` as a ,industry  WHERE a.`code`=industry.`code` AND a.date>='20210629';

效果如下:

其中partition by的作用于group by的作用类似,可以在组内平均值的计算,order by可以对字段进行排序,当然partition by与order by可以根据需要进行填写。



以上是关于MYSQL的窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL的窗口函数

css有用的代码片段

GMSMarker 信息窗口内容(片段)未更新

MySQL8.0窗口函数之排名函数(rankdense_rank)的使用

MySQL8.0窗口函数之排名函数(rankdense_rank)的使用

mysql 强大的trim() 函数