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、比赛日期、比赛结果,求用户最大连胜次数。
题解:
selectuid,max(total) as cntfrom(selectuid,a.r1-a.r2 as r,sum(num) as totalfrom(SELECTuid,if(result = 'win', 1, 0) as num,ROW_NUMBER() over(partition by uid order by play_day) r1,ROW_NUMBER() OVER(partition by uid, result order by play_day) as r2froms_games) agroup byuid,a.r1-a.r2) bgroup byb.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;
