0

这是我有一张包含客户详细信息的表格以及他们安装我的应用程序的时间的场景,即使他们重新安装了应用程序,他们也会找到回到表格的方法。在下表中,我有相同客户的购买时间。

users
uid Version install_time
1   1   2013-06-01 00:00:00
1   2   2014-06-01 00:00:00  
1   3   2014-10-01 00:00:00
2   3   2014-11-11 00:00:00
3   2   2013-11-11 00:00:00
4   4   2015-01-01 00:00:00

trans
uid transaction_time
1   2013-07-01 00:00:00
1   2014-07-01 00:00:00
1   2014-11-01 00:00:00
2   2014-12-11 00:00:00
999 2014-11-04 00:13:49

问:平均而言,客户进行第一次购买需要多少天?

这是我到目前为止所尝试的:

select avg(`purchase after install`) as average
from 
(
select 
u.uid,
dayofyear(t.transaction_time)-dayofyear(u.install_time) AS `purchase after install`
from users u 
left join trans t -- joining the transaction time to user table 
on u.uid=t.uid
where t.transaction_time >= u.install_time -- because the cartesian product from the join is creating additional rows for uid 1
-- group by 1
) final

我得到了 65 天,但如果你注意到这张表,平均应该是 30 天,因为我已经将购买间隔了 30 天。

4

2 回答 2

0
 DROP TABLE IF EXISTS users;

 CREATE TABLE users
 (uid INT NOT NULL
 ,Version INT NOT NULL
 ,install_time DATETIME NOT NULL
 ,PRIMARY KEY(uid,Version,install_time)
 );

 INSERT INTO users VALUES
 (1   ,1   ,'2013-06-01 00:00:00'),
 (1   ,2   ,'2014-06-01 00:00:00'),
 (1   ,3   ,'2014-10-01 00:00:00'),
 (2   ,3   ,'2014-11-11 00:00:00'),
 (3   ,2   ,'2013-11-11 00:00:00'),
 (4   ,4   ,'2015-01-01 00:00:00');

 DROP TABLE IF EXISTS trans;

 CREATE TABLE trans
 (uid INT NOT NULL
 ,transaction_time DATETIME NOT NULL
 ,PRIMARY KEY(uid,transaction_time)
 );

 INSERT INTO trans VALUES
 (1   ,'2013-07-01 00:00:00'),
 (1   ,'2014-07-01 00:00:00'),
 (1   ,'2014-11-01 00:00:00'),
 (2   ,'2014-12-11 00:00:00'),
 (999 ,'2014-11-04 00:13:49');

 SELECT u.*
      , MIN(t.transaction_time) min_t
      , DATEDIFF(MIN(t.transaction_time),u.install_time) diff 
   FROM users u 
   JOIN trans t 
     ON t.uid = u.uid 
    AND t.transaction_time >= u.install_time 
  GROUP 
     BY u.uid
      , u.version
      , u.install_time;
 +-----+---------+---------------------+---------------------+------+
 | uid | Version | install_time        | min_t               | diff |
 +-----+---------+---------------------+---------------------+------+
 |   1 |       1 | 2013-06-01 00:00:00 | 2013-07-01 00:00:00 |   30 |
 |   1 |       2 | 2014-06-01 00:00:00 | 2014-07-01 00:00:00 |   30 |
 |   1 |       3 | 2014-10-01 00:00:00 | 2014-11-01 00:00:00 |   31 |
 |   2 |       3 | 2014-11-11 00:00:00 | 2014-12-11 00:00:00 |   30 |
 +-----+---------+---------------------+---------------------+------+

我将把拼图的最后一块留给读者作为练习。

于 2014-11-04T10:35:02.157 回答
-1

试试看

select AVG(datediff(day,a.date1,b.date2)) from  table1 as a inner join table2 as b on a.id=b.id where a.date1>=b.date2
于 2014-11-04T09:55:13.150 回答