MYSQL:在不使用子查询的情况下,如何将算术表达式指定为SELECT子句中字段的值?
这是我的疑问:MYSQL:在不使用子查询的情况下,如何将算术表达式指定为SELECT子句中字段的值?,mysql,sql,Mysql,Sql,这是我的疑问: SELECT DISTINCT id, stat, date, user_id FROM data AS T1 WHERE 2.0 >= ( SELECT avg1 FROM ( SELECT stat, AVG(value) AS avg1 FROM data WHERE date > SUBTIME(NOW(), MAKETIME(168, 0, 0))
SELECT DISTINCT id, stat, date, user_id
FROM data AS T1
WHERE 2.0 >= (
SELECT avg1
FROM (
SELECT stat, AVG(value) AS avg1
FROM data
WHERE date > SUBTIME(NOW(), MAKETIME(168, 0, 0))
GROUP BY stat_name) b1
WHERE stat = T1.stat
AND id = T1.id)/
(
SELECT avg2
FROM (
SELECT stat, AVG(value) AS avg2
FROM cata
WHERE date > SUBTIME(NOW(), MAKETIME(336, 0, 0))
AND date <= SUBTIME(NOW(), MAKETIME(168, 0, 0))
GROUP BY stat) b2
WHERE stat = T1.stat
AND id = T1.id)
ORDER BY id;
我的想法是创建一个统计表,本周的平均值是上周平均值的两倍多
我的问题是:我想为每个统计数据选择一列diff_values,它代表本周的最大值-上周的最大值,代表过去一周的增长。基本上,今天统计的条目是昨天的统计加上增长。如果不创建两个子查询(类似于WHERE子句中的子查询),我想不出一种方法来实现它,但是这样做会使查询执行时间非常长,因为数据是一个相当大的表
有没有办法在现有子查询之间进行数学分割?如果我正确理解了您的查询,那么您正在尝试计算本周和上周每个用户的每个统计数据的平均值 如果是,以下查询将以更简单的方式执行此操作:
select stat, user_id,
avg(case when date > SUBTIME(NOW(), MAKETIME(168, 0, 0)) then value end) as thisweek,
avg(case when date > SUBTIME(NOW(), MAKETIME(336, 0, 0)) AND date <= SUBTIME(NOW(), MAKETIME(168, 0, 0)) then value end) as lastweek
from data
group by stat, user_id
having 2.0 >= thisweek / lastweek
它使用条件聚合来计算每个平均值,使用您当时的逻辑-我没有改变这一点。然后它使用having子句进行比较。哇,这可以更快、更紧凑地完成我想做的事情。谢谢