examples - MySQL AVG(TIMESTAMPDIFF) con GROUP BY
sql count group by (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
Reemplacé el LEFT JOIN con un INNER JOIN porque creo que eso es lo que quieres, pero no es 100% equivalente a WHERE t.user_id IS NOT NULL
.
Siéntase libre de volver a colocar la UNIÓN IZQUIERDA si es necesario.
Tengo dos tablas de user (one)
y transaction (many)
y necesito obtener el tiempo promedio en días desde que se creó un usuario hasta cuando hicieron su primera transacción. Estoy usando AVG(TIMESTAMPDIFF)
que funciona bien, excepto que GROUP BY
devuelve un promedio contra cada usuario en lugar de un promedio único para todos los usuarios únicos en la tabla de transaction
. Si elimino GROUP BY
, obtengo una cifra promedio única, pero tiene en cuenta las transacciones múltiples de los usuarios, mientras que solo quiero tener una por usuario (la primera que hicieron).
Aquí está mi 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;
Agradecería que alguien me ayude a devolver el promedio solo para usuarios únicos. Está bien dividir la consulta en dos, pero las tablas son grandes, por lo que devolver muchos datos y volver a colocarlos es un "no-go". Gracias por adelantado.
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;