[英]Trouble with MySQL query using AVG()
我正在使用一个查询,该查询平均获取每个给定ID的所有记录...
$query = "SELECT bline_id, AVG(flow) as flowavg
FROM blf
WHERE bline_id BETWEEN 1 AND 30
GROUP BY bline_id
ORDER BY bline_id ASC";
这些记录每个每天更新一次。 我只想对平均每个ID使用10条最新记录。
任何帮助将不胜感激。
blf表的结构为:
id | bline_id | flow | date
如果这些确实每天更新,请使用日期算法:
SELECT bline_id, AVG(flow) as flowavg
FROM blf
WHERE bline_id BETWEEN 1 AND 30 and
date >= date_sub(now(), interval 10 day)
GROUP BY bline_id
ORDER BY bline_id ASC
否则,您必须放入一个计数器,您可以使用相关的子查询:
SELECT bline_id, AVG(flow) as flowavg
FROM (select blf.*,
(select COUNT(*) from blf blf2 where blf2.bline_id = blf.bline_id and blf2.date >= blf.date
) seqnum
from blf
) blf
WHERE bline_id BETWEEN 1 AND 30 and
seqnum <= 10
GROUP BY bline_id
ORDER BY bline_id ASC
另一个选项是模拟ROW_NUMBER()。
该语句创建一个计数器,并在每次遇到新的bline_id时将其重置。 然后,它将筛选出不在前10行中的所有记录。
SELECT bline_id,
Avg(flow) avg
FROM (SELECT id,
bline_id,
flow,
date,
CASE
WHEN @previous IS NULL
OR @previous = bline_id THEN @rownum := @rownum + 1
ELSE @rownum := 1
end rn,
@previous := bline_id
FROM blf,
(SELECT @rownum := 0,
@previous := NULL) t
WHERE bline_id > 0 and bline_id < 31
ORDER BY bline_id,
date DESC,
id) t
WHERE rn < 11
GROUP BY bline_id
值得一提的是,删除分组并查看中间结果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.