MySQL how to calculate average value of max/min N records by group

本文介绍如何在MySQL中计算特定分组下最新N天的价格平均值,通过自连接和变量的方式实现对每种水果最近三天价格的平均计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

This is a brief sample of how to calculate the average value of max/min N records by group in MySQL.


For example: a table fruit has 3 volumes; name, date, price.


apple  2015-10-011.10

orange 2015-10-012.50

banana 2015-10-013.40


apple  2015-10-021.20

orange 2015-10-022.40

banana 2015-10-022.20


apple  2015-10-031.30

orange 2015-10-032.30

banana 2015-10-033.10


apple  2015-10-041.40

orange 2015-10-042.20

banana 2015-10-043.30


apple  2015-10-051.50

orange 2015-10-052.10

banana 2015-10-053.50



We want to get the average price of the latest 3 days for each fruit, for example,

apple: the average value = 1.50 (2015-10-05) + 1.40 (2015-10-04) + 1.30 (2015-10-03)    = 1.40

orange: the average value = 2.10 (2015-10-05) + 2.20 (2015-10-04) + 2.30 (2015-10-03)  = 2.20

apple: the average value = 3.50 (2015-10-05) + 3.30 (2015-10-04) + 3.10 (2015-10-03)     = 3.30



Sample SQL:


create table fruit(name varchar(20), date char(10), price float(4,2), constraint pk_fruit primary key(name, date));


insert into fruit values('apple',  '2015-10-01', 1.10);

insert into fruit values('orange', '2015-10-01', 2.50);

insert into fruit values('banana', '2015-10-01', 3.40);


insert into fruit values('apple',  '2015-10-02', 1.20);

insert into fruit values('orange', '2015-10-02', 2.40);

insert into fruit values('banana', '2015-10-02', 3.20);


insert into fruit values('apple',  '2015-10-03', 1.30);

insert into fruit values('orange', '2015-10-03', 2.30);

insert into fruit values('banana', '2015-10-03', 3.10);


insert into fruit values('apple',  '2015-10-04', 1.40);

insert into fruit values('orange', '2015-10-04', 2.20);

insert into fruit values('banana', '2015-10-04', 3.30);


insert into fruit values('apple',  '2015-10-05', 1.50);

insert into fruit values('orange', '2015-10-05', 2.10);


The query SQL:


mysql> set @num := 0;

mysql> set @type := '';

mysql> select name, date, avg(price)

    ->  from (select a.*

    ->  from fruit a inner join (

    ->    SELECT name, date, case when @mid = name then @row:=@row+1 else @row:=1 end rownum, @mid:=name mid FROM fruit order by name, date desc) b

    ->    on b.name = a.name and b.date = a.date

    -> where b.rownum<=3) as tmp

    -> group by name;

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

| name   | date       | avg(price) |

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

| apple  | 2015-10-05 |   1.400000 |

| banana | 2015-10-05 |   3.300000 |

| orange | 2015-10-05 |   2.200000 |

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

3 rows in set (0.00 sec)



The original reference:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值