1. 最大连胜次数

输入:

uid play_day result
1 2022-01-17 win
1 2022-01-18 win
1 2022-01-25 win
1 2022-01-31 draw
1 2022-02-08 win
2 2022-02-06 lose
2 2022-02-08 lose
3 2022-02-10 win

输出:

uid cnt
1 3
2 0
3 1

输入数据为:用户ID、比赛日期、比赛结果,求用户最大连胜次数。
题解:

  1. select
  2. uid,
  3. max(total) as cnt
  4. from
  5. (
  6. select
  7. uid,
  8. a.r1-a.r2 as r,
  9. sum(num) as total
  10. from
  11. (
  12. SELECT
  13. uid,
  14. if(result = 'win', 1, 0) as num,
  15. ROW_NUMBER() over(partition by uid order by play_day) r1,
  16. ROW_NUMBER() OVER(partition by uid, result order by play_day) as r2
  17. from
  18. s_games) a
  19. group by
  20. uid,
  21. a.r1-a.r2) b
  22. group by
  23. b.uid;

2. 最多连胜天数

输入:

uid play_day result
1 2022-01-17 win
1 2022-01-18 win
1 2022-01-25 win
1 2022-01-31 draw
1 2022-02-08 win
2 2022-02-06 lose
2 2022-02-08 lose
3 2022-02-10 win

输出:

uid cnt
1 2
2 0
3 1
输入数据为:用户ID、比赛日期、比赛结果,求用户最多连赢天数。比如用户1,在17和18号连赢了两天。<br />题解:
select
    uid,
    max(total) as cnt
from
    (
    select
        uid,
        a.dif_day-a.r1 as r,
        sum(num) as total
    from
        (
        SELECT
            uid,
      if(result = 'win', 1, 0) as num,
      datediff(play_day,'1970-01-01') as dif_day,
            ROW_NUMBER() OVER(partition by uid, result order by play_day) as r1
        from
            s_games) a
    group by
        uid,
        a.dif_day-a.r1) b
group by
    b.uid;

3. 同时在线最大人数

输入:

uid start_time end_time
1001 2021-06-14 12:12:12 2021-06-14 18:12:12
1003 2021-06-14 13:12:12 2021-06-14 16:12:12
1004 2021-06-14 13:15:12 2021-06-14 20:12:12
1002 2021-06-14 15:12:12 2021-06-14 16:12:12
1005 2021-06-14 15:18:12 2021-06-14 17:12:10
1001 2021-06-12 20:30:14 2021-06-14 21:24:12

输出:

5

思路:先对用户登录数据进行打平,登录操作记为1,登出操作记为-1,然后利用sum开窗函数计算累积值。
题解:

select
    max(sum) as num
from
    (
    SELECT
        uid,
        dt,
        num,
        SUM(a.num) over(partition by 1 order by dt) as sum
    from
        (
        SELECT uid, start_time as dt, 1 as num from live
    union all
        select uid, end_time as dt, -1 as num from live
    ) a
    order by
        dt) b;

4. 互相关注好友

输入:

uid friend_id
a b
c d
d e
b a
e f
d c
c g

输出:

a b
c d

题解:

SELECT
    a.*
from
    (
    SELECT
        uid,
        friend_id
    from
        `user`
    group by
        uid,
        friend_id
) a
join (
    select
        uid,
        friend_id
    from
        `user`
    group by
        uid,
        friend_id
) b
on
    a.uid = b.friend_id
    and a.friend_id = b.uid
where
    a.uid > b.uid;