2011-09-01 133 views
1

我有兩個表user (one)transaction (many),我需要從用戶創建時間到他們進行第一次交易時的平均時間。我使用的是AVG(TIMESTAMPDIFF),它運行良好,但GROUP BYtransaction表中的所有唯一用戶返回的是平均值而不是每個用戶的平均值。如果我刪除了GROUP BY,我會得到一個單一的平均數字,但它考慮到來自用戶的多個交易,而我只想爲每個用戶(他們的第一個用戶)提供一個交易。MySQL的AVG(TIMESTAMPDIFF)與GROUP BY

這裏是我的SQL:

SELECT AVG(TIMESTAMPDIFF(DAY, u.date_created, t.transaction_date)) AS average 
FROM transaction t 
LEFT JOIN user u ON u.id = t.user_id 
WHERE t.user_id IS NOT NULL AND t.status = 1 
GROUP BY t.user_id; 

我會很感激,如果有人能幫助我回到平均只有唯一用戶。把查詢分成兩份是很好的做法,但表格很大,所以返回大量數據並將其重新放入是不合格的。提前致謝。

回答

2
SELECT AVG(TIMESTAMPDIFF(DAY, S.date_created, S.transaction_date)) AS average 
FROM (
    SELECT u.date_created, t.transaction_date 
    FROM transaction t 
    INNER JOIN user u ON u.id = t.user_id 
    WHERE t.status = 1 
    GROUP BY t.user_id 
    HAVING u.date_created = MIN(u.date_created) 
) s 

我更換了LEFT JOIN與INNER JOIN,因爲我覺得就是你想要的東西,但它不是100%equivalant您WHERE t.user_id IS NOT NULL
如果需要,請隨時將LEFT JOIN放回。

+0

謝謝,這個工程。 s.day不起作用,因爲它是該功能的一部分,但刪除它卻有訣竅。 – Tom

+0

是的,發現它,謝謝。 – Tom

2
select avg(TIMESTAMPDIFF(DAY, u.date_created, min_tdate)) as average 
from user u 
inner join 
(select t.user_id, min(t.transaction_date) as min_tdate 
from transaction t 
where t.status=1; 
group by t.user_id 
) as min_t 
on u.id=min_t.user_id; 
+0

+1也可以工作,我不知道它是否更快... – Johan