私の一日あたりのゲームを実行するために失敗するユーザーの割合を与えるSQLクエリ

ロハン:

私は本当に私が書き込みに苦労してきたSQLクエリのヘルプをいただければと思います。

背景

毎回ユーザーがレコードがテーブルに作成される、ゲームを果たしているgame_runs彼らと一緒に、user_idrun_date(MySQLのタイムスタンプ)。

  • ユーザーが正常にゲームをプレイすると、彼らは0よりも大きいスコアを取得します。
  • ゲームの実行に失敗した場合(例えば、多分それがクラッシュした)、スコアがあります 0

テーブルには、次のようになります。

 id  |     run_date         |  user_id   |   score   
-------------------------------------------------------
 1   |  2020-02-02 00:20:00 |    10      |     0      |   
 2   |  2020-02-02 01:50:10 |    10      |    40      |   
 3   |  2020-02-02 03:40:20 |    11      |    80      |   

 4   |  2020-02-03 03:20:14 |    20      |    80      |   
 5   |  2020-02-03 12:20:14 |    21      |     0      |   

 6   |  2020-02-04 06:20:42 |    50      |     0      |   
 7   |  2020-02-04 11:15:00 |    50      |     0      |
 8   |  2020-02-04 12:10:46 |    51      |    70      |   

 9   |  2020-02-05 00:15:00 |    60      |     0      |
10   |  2020-02-05 01:10:40 |    61      |     0      |   

私はのパーセント何かを見つけるしたいユーザーは、一日あたりのゲームを実行するために失敗します。

上記の例では、ここで私は私が生成することができます願っていますものです:

date         |   percent_users_who_failed_to_run_the_game
-------------------------------------------------------------
2020-02-02   |   0
2020-02-03   |   0.5
2020-02-04   |   0.5
2020-02-05   |   1

方法についてのお知らせ2020-02-02ゲームを実行するために失敗したユーザーの割合が0%である、(つまり誰もが一度少なくとも成功しました)。上からです2020-02-02、3回の実行がありました:

  • ID = 1:USER_IDは、10最初にそれを実行することができなかった(スコア= 0)
  • ID = 2:USER_IDが10二度目に成功した(スコア= 40)
  • ID = 3:USER_IDが11成功

両方のユーザーがその日に成功したので、失敗したユーザーの割合は0%でした。

私が開始する方法上の任意の入力を大好きです。私は、MySQLを使用していますV8 +それが必要な場合はそう(私の研究は、彼らが助けてと言われますが、これを行うクエリを記述することができませんでした)ウィンドウ関数へのアクセス権を持っています。

私は右のロジックが持っているユーザーの%を見つけるの線に沿って何かだと思うMAX(score) = 0のクエリを作成する方法が、わかりません。

私は本当にあなたがこれまで読んで感謝し、任意のポインタがとても参考になります - 私はそれがあまりにも不明瞭ではなかった願っています。

ありがとうございました!

GarethD:

私はあなたが二段階でこれを実行する必要があると思います。最初のステップは、一日あたりのユーザーごとの最大スコアを得ることです:

SELECT  CAST(Run_Date AS DATE) AS RunDate,
        User_ID,
        MAX(Score) AS Score
FROM    YourTable
GROUP BY CAST(Run_Date AS DATE), User_ID;

その後、サブクエリでこれを入れて、あなたの割合を計算することができます:

SELECT  RunDate,
        COUNT(CASE WHEN Score = 0 THEN 1 END) / SUM(1.0) AS Failed_Percent
FROM    (   SELECT  CAST(Run_Date AS DATE) AS RunDate,
                    User_ID,
                    MAX(Score) AS Score
            FROM    YourTable
            GROUP BY CAST(Run_Date AS DATE), User_ID
        ) AS t
GROUP BY RunDate;

SQLフィドルの例

また、使用したサブクエリせずにこれを達成することができますCOUNT(DISTINCT)

SELECT  CAST(Run_Date AS DATE) AS RunDate,
        1 - (1.0 * COUNT(DISTINCT CASE WHEN Score > 0 THEN User_ID END) 
            / COUNT(DISTINCT User_id)) AS Failed_Percent
FROM    YourTable
GROUP BY CAST(Run_Date AS DATE);

SQLフィドルの例

これは実際には逆の論理をやっているが、結果は同じです。関連する部分は以下のとおりです。

COUNT(DISTINCT CASE WHEN Score > 0 THEN User_ID END)

これはその後、任意の日付に成功したゲームを実行した個別のユーザーの合計数を取得します

COUNT(DISTINCT User_id) 

その日の記録をログインしているユーザーの合計数を与えます。私たちは失敗したのパーセントを取得するために、1から引いこれに必要なので、後者で割っ前者は、成功したユーザーの割合を示します。私は、暗黙的に回避するために、小数に変換する1.0によってカウントの1を乗じている部門整数

私は、最初のクエリは、より効率的であることを期待するだろうが、私は間違っている可能性があります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=8733&siteId=1