2016-07-25 10 views
0

私は1日、7日、および2週間の保持率を計算しようとしていますが、私は立ち往生しています。 usersというテーブルには、最初のログイン日があります。 loginsという表には、その後のすべてのログイン日があります。SQLを使用して保存を計算するにはどうすればよいですか?

私の考えは、loginsテーブルから「最大」または最新のログインを見つけて、ユーザーの最初のログイン以降の日数を確認することでした。最終的には、最初のログイン日までにグループ化し、1日後、7日後、14日後にアプリにログインしたこの「コホート」のユーザー数をカウントします。私は近くにいるように感じるが、そこにはあまりない。

以下は私が今までに持っているものです。

DESCRIBE users; 
Field    Type   Null Key Default    Extra       
---------------- ----------- ---- --- ------------------- --------------------------- 
uid    int(11)  YES MUL (null)            
device_id   varchar(64) YES  (null)            
install_ts  timestamp NO   CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP 
firstlogin_ts  timestamp NO   0000-00-00 00:00:00        
firstpurchase_ts timestamp NO   0000-00-00 00:00:00    

DESCRIBE logins; 
Field  Type   Null Key Default   Extra       
----------- ----------- ---- --- ----------------- --------------------------- 
uid   int(11)  NO   (null)           
device_id varchar(64) NO   (null)           
login_ts  timestamp NO   CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP 
login_count int(11)  NO   (null)           
level  int(11)  NO   (null)           


SELECT logins.uid, 
    MAX(CAST(login_ts AS Date)) AS login_dt, 
    CAST(firstlogin_ts AS Date) AS firstlogin_dt, 
    MAX(DATEDIFF(CAST(login_ts AS Date), 
    CAST(firstlogin_ts AS Date))) AS retentionDays 
FROM logins 
LEFT JOIN users 
ON logins.uid = users.uid 
GROUP BY logins.uid 
ORDER BY logins.uid, login_dt 

uid  login_dt firstlogin_dt retentionDays 
------ ---------- ------------- ------------- 
121043 2015-01-04 (null)   (null)   
121044 2015-01-04 (null)   (null)   
121045 2015-01-06 2015-01-01  5    
121046 2015-01-05 2015-01-01  4    
121047 2015-01-04 2015-01-01  3    
121049 2015-01-05 2015-01-01  4    
121050 2015-01-02 2015-01-01  1    
121054 2015-01-04 2015-01-01  3    
121055 2015-01-15 2015-01-01  14    
121056 2015-01-07 2015-01-01  6    
121057 2015-01-12 2015-01-01  11    
121058 2015-01-02 2015-01-01  1    
121060 2015-01-11 2015-01-01  10    
121063 2015-01-07 2015-01-01  6    
121065 2015-01-05 2015-01-01  4    
121066 2015-01-07 2015-01-01  6    
121067 2015-01-03 2015-01-01  2    
121069 2015-01-03 2015-01-01  2    
121070 2015-01-06 2015-01-01  5  

ご迷惑をおかけして申し訳ございません。

答えて

0

私はあなたの質問の質問が正しいと仮定するつもりです、そして、あなたはそれを一歩前進させる助けが必要です。

最初のクエリの結果から選択し、retentionDays> = 1、retentionDays> = 7のユーザー数、およびretentionDaysを持つユーザー数を数えますSQLに翻訳> = 14

、それはのようなクエリ与える:あなたの代わりに値の比をしたい場合、あなたはCOUNT(uid)によって各合計を分割することができ

SELECT 
    SUM(IF(retentionDays >= 1, 1, 0)) as 1day 
    SUM(IF(retentionDays >= 7, 1, 0)) as 7days 
    SUM(IF(retentionDays >= 14, 1, 0)) as 14days 
FROM (
    /* your previous query */ 
) as computedRetentionDays; 

を。

これは、usersに列lastlogin_tsを追加することで、あなたの人生をはるかに簡単にすることができます(このクエリははるかに高速になります)。

+0

これはうまくいきました。どうもありがとうございます@rlanvin。クエリ内のクエリ(これはサブクエリと呼ばれていると思います)を「入れ子にする」(それを呼び出すのは何ですか?) – user2205916

+1

@ user2205916これは、派生テーブル、または単に「FORM句のサブクエリ」と呼ばれています。 – rlanvin

関連する問題