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;

アイデアは、今週の平均値が先週の平均値の 2 倍を超える統計の表を作成することです。

私の問題は次のとおりです。過去 1 週間の増加を表す、各統計の MAX(今週の値) - MAX(先週の値) を表す列 diff_values を選択したいと考えています。(基本的に、今日の統計は昨日の統計に増加分を足したものです。) WHERE 句と同様のサブクエリを 2 つ作成しないと方法が思いつきませんが、そうするとクエリの実行時間が長くなります。データはかなり大きなテーブルなので、非常に長いです。

既存のサブクエリ間で数学を分割する方法はありますか?

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 に答える