2016-09-22 72 views
0

我有一個SQL表,大致有以下幾種結構:多個聚合聲明

id | datetime | value 
--------------------- 

我想是出現以下結構的結果:

id | value_avg_overall | value_avg_last_month | value_avg_last_week 
------------------------------------------------------------------- 

目前我我使用JOIN,即構建類似於一個查詢:

SELECT * 
FROM (
    SELECT_OVERALL INNER JOIN SELECT_LAST_MONTH ON SELECT_OVERALL.id = SELECT_LAST_MONTH.id 
    ) 
INNER JOIN SELECT_LAST_WEEK ON SELECT_LAST_WEEK.id = SELECT_LAST_MONTH.id; 

我簡化了查詢以使其更具可讀性,SELECT_*語句簡單,SELECT語句使用GROUP BY連同AVG()在各自的時間範圍內。

這是執行多個聚合並將所有這些聚合返回到MySQL中的單個結果集中的最有效方法嗎?

回答

2

這就是所謂有條件聚集:

select 
    id, 
    avg(value) as value_avg_overall, 
    avg(case when datetime > date_sub(curdate(), interval 1 month) then value end) 
    as value_avg_last_month, 
    avg(case when datetime > date_sub(curdate(), interval 1 week) then value end) 
    as value_avg_last_week 
from mytable 
group by id; 
0

我相信你可以不用連接。

SELECT id, AVG(value), AVG(IF(date BETWEEN x AND y, value, NULL)) FROM table GROUP BY id