pgadminIII/postgresqlを使用してユーザーのログインセッションの日次保持を計算しようとしています。PosgreSQLを使用して毎日のユーザーの保持を計算する
table1
はuser_id
、first_login_date
、last_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_id
、session_id
、login_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
が適切でしょう。
データがtable1
とtable2
である場合、私の定義したクエリを使用すると2日間の保存結果が正確になりますか? この保存量を計算する最適な方法はありますか?
このクエリは、個別のユーザーをフィルタしません。この 'join'では、自分の入力よりも多くの行を生成します。 – owwoow14
@ owwoow14:編集済み –