2016-05-30 6 views
0

pgadminIII/postgresqlを使用してユーザーのログインセッションの日次保持を計算しようとしています。PosgreSQLを使用して毎日のユーザーの保持を計算する

table1user_idfirst_login_datelast_login_date

CREATE TABLE table1 (user_id numeric, first_login_date date, last_login_date date); 

    INSERT INTO table1 (user_id, first_login_date, last_login_date) VALUES (12346, '2010-06-01', '2010-06-02'), 
(67890, '2010-03-01', '2010-03-10'), 
(67890, '2010-03-01', '2010-03-10'), 
(90123, '2010-08-01', '2010-08-15'), 
(45678, '2010-08-01', '2010-08-20'), 
(76543, '2010-07-01', '2010-07-01'); 

table2を持っているいくつかの重複がtable1でありuser_idsession_idlogin_date

CREATE TABLE table2 (user_id numeric, session_id numeric, login_date date); 

INSERT INTO table2 (user_id, session_id, login_date) VALUES 
(12346, '8764', '2010-06-02'), 
(67890, '4657', '2010-03-05'), 
(90123, '3945', '2010-08-09'), 
(45678, '20845', '2010-08-02'), 
(67890, '29384', '2010-03-07'), 
(90123, '3424', '2010-08-12'), 
(45678, '349284', '2010-08-10'); 

ています。 このため、2日間の保存期間と5日間の保存期間を持つユーザーを計算するクエリが正しいかどうかは不明です。

私は2日間のために使っていたクエリは次のとおりです。

私はDISTINCT句を追加する場合は、しかし、2日間の保持

と7人のユーザの結果を与える

SELECT table1.user_id, first_login_date, table2.login_date, 
(table2.login_date - table1.first_login_date) as datediff, FROM table1 
JOIN table2 ON table2.user_id = table2.user_id WHERE 
(table2.login_date - table1.first_login_date) = 1; 

、など次のようになります。

SELECT distinct table1.user_id, first_login_date, table2.login_date, 
    (table2.login_date - table1.first_login_date) as datediff FROM table1 
    JOIN table2 ON table2.user_id = table2.user_id WHERE 
    (table2.login_date - table1.first_login_date) = 1; 

2人のユーザーの結果が得られます。

私はHERE,HEREおよびHEREの日常的な保持の計算について相談しました。私の技術が私に正しい結果をもたらしているかどうかはわかりません。たとえば、DAUを計算するには、self-joinが適切でしょう。

データがtable1table2である場合、私の定義したクエリを使用すると2日間の保存結果が正確になりますか? この保存量を計算する最適な方法はありますか?

答えて

1

あなたは自分自身にtable2に参加している:

ON table2.user_id = table2.user_id 

は、サブクエリでdistinctを行います

select distinct on (t2.login_date) 
    user_id, 
    first_login_date, 
    t2.login_date, 
    t2.login_date - t1.first_login_date as datediff 
from 
    (
     select distinct * 
     from t1 
    ) t1 
    inner join 
    t2 using (user_id) 
where t2.login_date - t1.first_login_date = 1 
user_id | first_login_date | login_date | datediff 
---------+------------------+------------+---------- 
    12346 | 2010-06-01  | 2010-06-02 |  1 
    45678 | 2010-08-01  | 2010-08-02 |  1 
+0

このクエリは、個別のユーザーをフィルタしません。この 'join'では、自分の入力よりも多くの行を生成します。 – owwoow14

+0

@ owwoow14:編集済み –

関連する問題