作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的查询:
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;
我的想法是创建一个统计数据表,其本周的平均值是上周平均值的两倍以上。
我的问题是这样的:我想为每个统计数据选择一个代表 MAX(本周值)- MAX(上周值)的列 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
子句进行比较。
关于MYSQL:如何在不使用子查询的情况下将算术表达式指定为 SELECT 子句中字段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16182441/
我是一名优秀的程序员,十分优秀!