1

2 つのテーブルがあります。INSTALLS と EXECUTES と呼びましょう。

INSTALLS テーブルの構造は、user_id BIGINT、install_ts BIGINT です。

EXECUTES テーブルの構造は同じです: user_id BIGINT、exec_ts BIGINT。

user_id は明らかです。_ts フィールドは、Unix エポックからカウントされた秒数として表されるタイムスタンプです。

これら 2 つのテーブルは次のように設定されます。

ユーザーがアプリケーションをインストールするたびに、INSTALLS テーブルに値が入力されます。アンインストールしてから再インストールすると、同じユーザーの別の行がこの表に表示されます (ts は異なります)。すべての分析で、最も古いインストール タイムスタンプを使用する必要があります。

ユーザーがアプリケーションを使用するたびに、EXECUTES テーブルに user_id と実行時刻が入力されます。

この構造の要約テーブルを作成する必要があります。

日付、その日のインストール数、翌日の使用数

これが私が問題にアプローチした方法です:

  1. 最も古いインストール日を取得:

    SELECT user_id, DATE(MIN(install_ts)) AS install_date FROM INSTALLS GROUP BY user_id

  2. 実行日を取得します (特定の日に複数の実行に対応する必要があります):

    SELECT user_id, DATE(exec_ts) AS exec_date FROM EXECUTES GROUP BY user_id, DATE(exec_ts)

  3. 次の 2 つを組み合わせます。

    SELECT a.install_date, COUNT(a.user_id) AS install_count, COUNT(b.user_id) AS usage_count FROM (SELECT user_id, DATE(MIN(install_ts)) AS install_date FROM INSTALLS GROUP BY user_id) a LEFT OUTER JOIN (SELECT user_id, DATE(exec_ts) AS exec_date FROM EXECUTES GROUP BY user_id, DATE(exec_ts)) b ON a.user_id = b.user_id GROUP BY a.install_date

これにより、いつでもアプリケーションを使用したすべてのユーザーがカウントされます。このデータセットから、インストール日の直後にアプリケーションを使用したユーザーのみを抽出する必要があります。

私が検討した 1 つのアプローチは、JOIN 条件を追加することでした。それを行うと、次のようになります(最初にクエリを実行し、その下にエラーが表示されます):

SELECT a.install_date, COUNT(a.user_id) AS install_count, COUNT(b.user_id) AS usage_count
FROM
    (SELECT user_id, DATE(MIN(install_ts)) AS install_date FROM INSTALLS GROUP BY user_id) a
    LEFT OUTER JOIN
    (SELECT user_id, DATE(exec_ts) AS exec_date FROM EXECUTES GROUP BY user_id, DATE(exec_ts)) b
    ON a.user_id = b.user_id AND DATEDIFF(b.exec_date, a.install_date) = 1
GROUP BY a.install_date

JOIN '1' で左と右の両方のエイリアスが検出されました

私が検討した 2 番目のアプローチは、WHERE 句に DATEDIFF を含めることでした。

SELECT a.install_date, COUNT(a.user_id) AS install_count, COUNT(b.user_id) AS usage_count
FROM
    (SELECT user_id, DATE(MIN(install_ts)) AS install_date FROM INSTALLS GROUP BY user_id) a
    LEFT OUTER JOIN
    (SELECT user_id, DATE(exec_ts) AS exec_date FROM EXECUTES GROUP BY user_id, DATE(exec_ts)) b
    ON a.user_id = b.user_id
WHERE b.user_id IS NULL OR DATEDIFF(b.exec_date, a.install_date) = 1
GROUP BY a.install_date

しかし、これは単純に間違っていることがわかります。ユーザーが 1 日目にインストールし、3 日目に戻ってきた場合、そのユーザーは install_count にカウントされません (結合されたテーブルに存在しないため)。だから今、私はちょっとアイデアがありません。私はSQLの初心者なので、どんな支援も本当に感謝しています。

4

2 に答える 2

1

私はこれを自分で解決しました。これが私がやった方法です:

SELECT x.install_date, COUNT(x.user_id) AS install_count, COUNT(y.user_id) AS usage_count
FROM (
    SELECT user_id, DATE(MIN(install_ts)) AS install_date FROM INSTALLS GROUP BY user_id
) x LEFT OUTER JOIN (
    SELECT a.user_id AS user_id, a.install_date AS install_date, b.exec_date AS exec_date
    FROM
        (SELECT user_id, DATE(MIN(install_ts)) AS install_date FROM INSTALLS GROUP BY user_id) a
        JOIN
        (SELECT user_id, DATE(exec_ts) AS exec_date FROM EXECUTES GROUP BY user_id, DATE(exec_ts)) b
        ON a.user_id = b.user_id
        WHERE DATEDIFF(b.exec_date, a.install_date) = 1
) y
GROUP BY x.install_date
于 2013-10-01T07:01:08.113 に答える