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;

这个想法是我创建了一个统计数据表,其本周的平均值是上周平均值的两倍多。

我的问题是:我想为每个统计数据选择一个表示 MAX(本周值)- MAX(上周值)的列 diff_values,表示过去一周的增长。(基本上,今天创建的 stat 条目是昨天的 stat 加上增加。)如果不创建两个类似于 WHERE 子句中的子查询,我想不出一种方法,但这样做会使查询执行时间增加真的很长,因为数据是一个很大的表。

有没有办法在现有子查询之间拆分数学?

4

1 回答 1

2

如果我正确理解您的查询,那么您正在尝试计算本周和上周每个用户的每个统计数据的平均值。

如果是这样,以下查询以更简单的方式执行此操作:

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子句进行比较。

于 2013-04-24T02:43:52.137 回答