[SQL]511+512+534+550+569

511. 遊戲玩法分析 I

solutionmysql

SELECT player_id, MIN(event_date) AS first_login
FROM Activity
GROUP BY player_id;

512. 遊戲玩法分析 II

SELECT player_id, device_id
FROM Activity 
WHERE (player_id, event_date) IN (SELECT player_id, MIN(event_date)
                                  FROM Activity
                                    GROUP BY player_id);

HAVING不行的緣由sql

having子句執行在select 以後, 所以having中的字段必須在select子句中, event_date沒有再select子句裏,因此不行code

534. 遊戲玩法分析 III

SELECT a1.player_id, a1.event_date, SUM(a2.games_played) AS games_played_so_far
FROM Activity a1, Activity a2
WHERE a1.player_id = a2.player_id
AND a1.event_date >= a2.event_date
GROUP BY a1.player_id, a1.event_date --這必定要有a1.event_date,不然Result會根據player_id自動合併
ORDER BY a1.player_id, a1.event_date;

另外一種方法:blog

SELECT player_id, event_date, 
    CASE WHEN @prev = player_id THEN @cnt := @cnt + games_played 
        WHEN @prev := player_id THEN @cnt := games_played 
    END 'games_played_so_far'
FROM (SELECT player_id, event_date, games_played 
    FROM activity 
    ORDER BY player_id, event_date) a, 
    (SELECT @cnt := 0, @prev := null) t;

550. 遊戲玩法分析 IV

方法一排序

SELECT ROUND(COUNT(DISTINCT player_id)/(SELECT COUNT(DISTINCT player_id)
                                        FROM Activity), 2) AS fraction
FROM Activity
WHERE (player_id, event_date) IN(SELECT player_id, DATE(MIN(event_date)+1)
                                 FROM Activity
                                 GROUP BY player_id);

方法二遊戲

SELECT ROUND(SUM(CASE WHEN DATEDIFF(a.event_date, b.first_date)=1 THEN 1 ELSE 0 END) / (SELECT COUNT(DISTINCT player_id)
FROM Activity), 2) AS fraction
FROM Activity a, --千萬不要漏掉這個逗號!!
(SELECT player_id, MIN(event_date) AS first_date
FROM Activity
GROUP BY player_id) b
WHERE a.player_id = b.player_id;

569. 員工薪水中位數

SELECT b.id,b.company,b.salary
-- 3. 鏈接結果
FROM (
    -- 1. 按 company 分組排序,記爲 `rk`
    SELECT id,company,salary,
    CASE @com WHEN company THEN @rk:=@rk+1 ELSE @rk:=1 END rk,
    @com:=company
    FROM employee,(SELECT @rk:=0, @com:='') a
    ORDER BY company,salary) b
LEFT JOIN 
    (-- 2. 計算各 company 的記錄數除以2,記爲 `cnt`
    SELECT company,COUNT(1)/2 cnt FROM employee GROUP BY company) c
ON b.company=c.company
-- 4. 找出符合中位數要求的記錄
WHERE b.rk in (cnt+0.5,cnt+1,cnt);
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息