LeetCode:Database 12.ゲームプレイ解析IV

2203 ワード

要求:SQLクエリーを作成し、最初にログインした翌日に再ログインしたプレイヤーの比率を報告し、小数点以下2桁まで四捨五入する.すなわち、初回ログイン日から少なくとも2日間連続してログインしたプレイヤーの数を計算し、プレイヤー総数で除算する必要があります.
Activityテーブルの構造:
+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| player_id    | int     |
| device_id    | int     |
| event_date   | date    |
| games_played | int     |
+--------------+---------+
(player_id,event_date)      。
                  。
           ,                        (    0)

Activityテーブル:
+-----------+-----------+------------+--------------+
| player_id | device_id | event_date | games_played |
+-----------+-----------+------------+--------------+
| 1         | 2         | 2016-03-01 | 5            |
| 1         | 2         | 2016-03-02 | 6            |
| 2         | 3         | 2017-06-25 | 1            |
| 3         | 1         | 2016-03-02 | 0            |
| 3         | 4         | 2018-07-03 | 5            |
+-----------+-----------+------------+--------------+

Result table:
+-----------+
| fraction  |
+-----------+
| 0.33      |
+-----------+
   ID   1                ,      1/3 = 0.33

分析:方法1:1.要求登録時間は初回登録の翌日であるため、初日登録のプレイヤー2を選別する必要がある.翌日も登録するプレイヤー3を絞り込む.初回登録と翌日登録のプレイヤー数を求め、合計人数で割る最終結果4を得る.最終結果はround()関数を用いて2ビットメソッド2:1を保持する.初回登録の翌日の日付、表中の同一プレイヤーの2回目の登録の日付を取得する.初回登録の翌日の日付が表の2回目の登録の日付と同じであるプレイヤーを選別し、合計人数で割る最終結果3を得る.最終結果round()関数を使用して2ビット保持
SQL文:
#1.  1
WITH t AS(
    SELECT i1,d1 FROM(
    SELECT player_id AS i1,event_date AS d1,dense_rank() over(PARTITION BY player_id ORDER BY  event_date) AS r
    FROM Activity)a
    WHERE r=1
)
select round(count(distinct b.player_id)/count(distinct c.player_id),2) as fraction 
from t  
join Activity b
on t.i1=b.player_id and datediff(b.event_date,t.d1)=1  
join Activity c;
#2.  2
SELECT ROUND(COUNT(DISTINCT a.player_id)/COUNT(DISTINCT b.player_id),2) as fraction  
FROM(
SELECT player_id,event_date,ADDDATE(event_date,1) AS d1,lead(event_date,1,0) over(PARTITION BY player_id ORDER BY event_date ASC) AS d2,
dense_rank() over(PARTITION BY player_id ORDER BY event_date ASC)AS r 
FROM Activity
)a
JOIN Activity b
ON a.r=1 AND a.d1=a.d2;