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

Q: 顧客が最初の購入を行うまで、平均で何日かかりますか?

これは私がこれまでに試みたことです:

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 に答える