sql >> データベース >  >> RDS >> PostgreSQL

翌日再びプレイされたパーセンテージを計算する

    テーブル定義にこの堅実なコアがあると仮定します:

    CREATE TABLE game_table (
      user_id   bigint NOT NULL
    , date      date   NOT NULL  -- date, not text!
    , game_name text   NOT NULL
    , UNIQUE (date, game_name, user_id)  -- !
    );
    

    そして、あなたが同じプレーヤーが翌日同じゲームをプレイすることを意味すると仮定します:

    SELECT round(ct_day2 * 100.0 / ct_day1, 2) AS repeat_percentage
    FROM  (
       SELECT count(*) AS ct_day1
            , count(d2.user_id) AS ct_day2
       FROM   instant_game_sessions d1
       LEFT   JOIN instant_game_sessions d2 ON (d2.user_id, d2.game_name, d2.date)
                                             = (d1.user_id, d1.game_name, d1.date + 1)
       WHERE  d1.date = '2021-01-07'
       AND    d1.game_name = 'Chess'
       ) sub;
    

    UNIQUE 制約により、翌日に一致するのは1つだけになります。したがって、count(*) は1日目の正しいカウントであり、count(d2.user_id) 2日目。残りは明らかです。

    UNIQUE 制約(この順序で列名を使用)も、クエリに最適なインデックスを提供します。参照:

    数値定数 100.0 デフォルトは自動的に数値になるため、明示的な型キャストを追加する必要はありません。関連:



    1. JavaでリモートMySQLデータベースに接続する方法は?

    2. 請求書テーブルのデザイン

    3. AJAX成功呼び出しのコードが機能しないのはなぜですか?

    4. 時系列データベースのスケーリング-TimescaleDBを単純にスケーリングする方法