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() ,2) AS 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的窗口函数的主要内容,如果未能解决你的问题,请参考以下文章
MySQL8.0窗口函数之排名函数(rankdense_rank)的使用