如何优化查询以按组选择平均值?

时间:2018-03-27 10:08:02

标签: sql postgresql

-----------
|  TABLE1 |
-----------
|id|class |
|1 |Class1|
|2 |Class2|
|3 |Class1|
|4 |Class1|
|5 |Class2|
|6 |Class3|
-----------

-----------------------
|       TABLE2        |
-----------------------
|id|table1_id|quantity|
|1 |    1    |    1   |
|2 |    1    |    2   |
|3 |    2    |    1   |
|4 |    2    |    1   |
|5 |    2    |    1   |
|6 |    4    |    1   |
|7 |    6    |    2   |
|8 |    6    |    1   |
-----------------------

我需要获得每个班级的所有平均数量。所以我选择table1按类分组的所有id,然后我使用WHERE IN选择id,从table2中选择avg(数量)。但是我的数据太多而且工作时间太长。我怎样才能获得更快的解决方案?

对于我的例子,我需要下一个答案

-----------
class |avg|
-----------
Class1|1,5|
Class2| 1 |
Class3|1,5|
-----------

4 个答案:

答案 0 :(得分:1)

select avg(table2.quantity), class
from table1, table2
where table1.id = table2.table1_id
group by table1.class

您还可以在列table1_id上添加和索引。这有助于提高查询速度。

答案 1 :(得分:1)

SELECT 
    T1.CLASS, 
    AVG(T2.QUANTITY) 
FROM 
    TABLE1 T1, TABLE2 T2 
    WHERE T1.ID = T2.TABLE1_ID
GROUP BY T1.CLASS

确保正确索引连接列。

答案 2 :(得分:1)

怎么样:

SELECT T1.ID, T1.CLASS, AVG(T2.QUANTITY) AS 'AVG'
FROM TABLE1 T1
INNER JOIN TABLE2 T2 ON T1.ID = T2.TABLE1_ID
GROUP BY T1.ID, T1.CLASS

答案 3 :(得分:1)

你有没有尝试过INNER JOIN?例如:

SELECT T1.class, AVG(T2.quantity)
FROM TABLE2 T2
INNER JOIN TABLE1 T1 ON T1.Id = T2.table1_id
GROUP BY T1.class