MySQL AVG(TIMESTAMPDIFF)和GROUP BY
我有两个表MySQL AVG(TIMESTAMPDIFF)和GROUP BY,mysql,group-by,average,Mysql,Group By,Average,我有两个表user(一个)和transaction(多个),我需要获得从创建用户到进行第一次交易的平均时间(以天为单位)。我使用的是AVG(TIMESTAMPDIFF),它运行良好,除了groupby返回每个用户的平均值,而不是事务表中所有唯一用户的单一平均值。如果我按删除分组,我会得到一个平均值,但它考虑了来自用户的多个事务,而我只希望每个用户都有一个事务(第一个事务) 以下是我的SQL: SELECT AVG(TIMESTAMPDIFF(DAY, u.date_created, t.tran
user(一个)
和transaction(多个)
,我需要获得从创建用户到进行第一次交易的平均时间(以天为单位)。我使用的是AVG(TIMESTAMPDIFF)
,它运行良好,除了groupby
返回每个用户的平均值,而不是事务
表中所有唯一用户的单一平均值。如果我按删除分组,我会得到一个平均值,但它考虑了来自用户的多个事务,而我只希望每个用户都有一个事务(第一个事务)
以下是我的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;
如果有人能帮我返回唯一用户的平均值,我将不胜感激。可以将查询分成两部分,但表很大,因此无法返回大量数据并将其放回。提前谢谢
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%等同于您的,其中t.user\u id不为NULL
如果需要,可以随意将左连接放回原位
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;
我用一个内部连接替换了左连接,因为我认为这是您想要的,但它不是100%等同于您的,其中t.user\u id不为NULL
如果需要,可以随意将左连接放回原位 谢谢,这个有用。s.day不起作用,因为这是函数的一部分,但删除它就可以了。谢谢,这很有效。s.day不起作用,因为这是函数的一部分,但是删除它就可以了。
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;