2017-08-01 5 views
-2

に除外自体に平均照会するための任意の高速な方法があります:最も効率的な方法がどうなるかテーブル名以下の場合はmysqlの

------------------------------------- 
team avg  avg_excluding_itself 
------------------------------------- 
A  2.0  4.25 
B  3.0  3.75 
C  5.5  2.50 

このテーブルを取得するためにteam_score

---------------------------- 
Team score date 
---------------------------- 
A  1  2017-07-01 
B  2  2017-07-02 
A  3  2017-07-02 
B  4  2017-07-01 
C  5  2017-07-02 
C  6  2017-07-01 

は?

以下のクエリは、あまりにもリソースを消費するため動作しません。テーブルのイメージングは​​100GBのサイズです。

select a.team, avg(a.score) as avg, avg(b.score) as avg_excluding_itself 
from team_score a join team_score b on a.team <> b.team group by a.team 
+2

どのようにリソースが消費されるという結論に達しましたか?結果を共有し、クエリで 'EXPLAIN'を実行して、リソース消費に関する問題を特定するのを助けてください。 –

+0

100GB?世界中のすべてのリトルリーグの試合のスコアはありますか? –

答えて

0

2つの原則:

  • 平均は数で割った値の合計です。

  • 「除外」は、除外されるものを除いた合計全体をとって計算できます。

収量:

SELECT 
     team, 
     ROUND(sum_me/count_me, 1) AS "Team's avg", 
     ROUND((sum_all - sum_me)/(count_all - count_me), 2) AS "Avg of others" 
    FROM (SELECT team, 
        SUM(score) AS sum_me, 
        COUNT(*) AS count_me 
       FROM team_score 
       GROUP BY team) AS me 
    JOIN (SELECT SUM(score) AS sum_all, 
        COUNT(*) AS count_all 
       FROM team_score) AS x -- only one row 
    GROUP BY team; 

2つのテーブルスキャン、各サブクエリのための1つがあります。これはあまりにも非効率的です。

関連する問題