私は本当に私が書き込みに苦労してきたSQLクエリのヘルプをいただければと思います。
背景:
毎回ユーザーがレコードがテーブルに作成される、ゲームを果たしているgame_runs
彼らと一緒に、user_id
とrun_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
のクエリを作成する方法が、わかりません。
私は本当にあなたがこれまで読んで感謝し、任意のポインタがとても参考になります - 私はそれがあまりにも不明瞭ではなかった願っています。
ありがとうございました!
私はあなたが二段階でこれを実行する必要があると思います。最初のステップは、一日あたりのユーザーごとの最大スコアを得ることです:
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;
また、使用したサブクエリせずにこれを達成することができます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);
これは実際には逆の論理をやっているが、結果は同じです。関連する部分は以下のとおりです。
COUNT(DISTINCT CASE WHEN Score > 0 THEN User_ID END)
これはその後、任意の日付に成功したゲームを実行した個別のユーザーの合計数を取得します
COUNT(DISTINCT User_id)
その日の記録をログインしているユーザーの合計数を与えます。私たちは失敗したのパーセントを取得するために、1から引いこれに必要なので、後者で割っ前者は、成功したユーザーの割合を示します。私は、暗黙的に回避するために、小数に変換する1.0によってカウントの1を乗じている部門整数
私は、最初のクエリは、より効率的であることを期待するだろうが、私は間違っている可能性があります。