Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL AVG(TIMESTAMPDIFF)和GROUP BY_Mysql_Group By_Average - Fatal编程技术网

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;