MySQL AVG (TIMESTAMPDIFF) с GROUP BY - PullRequest
       26

MySQL AVG (TIMESTAMPDIFF) с GROUP BY

1 голос
/ 01 сентября 2011

У меня есть две таблицы user (one) и transaction (many), и мне нужно получить среднее время в днях с момента создания пользователя до момента, когда он совершил свою первую транзакцию. Я использую AVG(TIMESTAMPDIFF), который работает хорошо, за исключением того, что GROUP BY возвращает среднее значение для каждого пользователя вместо одного единственного среднего для всех уникальных пользователей в таблице transaction. Если я удаляю 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 ]

2 голосов
/ 01 сентября 2011
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;
2 голосов
/ 01 сентября 2011
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

Я заменил ЛЕВОЕ СОЕДИНЕНИЕ на ВНУТРЕННЕЕ СОЕДИНЕНИЕ, потому что я думаю , что вы хотите, но это не на 100% эквивалентно вашему WHERE t.user_id IS NOT NULL.
Не стесняйтесь ставить ЛЕВОВернитесь, если это будет необходимо.

...