SQL数据库70题(力扣推荐)-我的刷题记录(持续更新)

1、游戏玩法分析1

写一条 SQL 查询语句获取每位玩家 第一次登陆平台的日期。

查询结果的格式如下所示:

Activity 表:
±----------±----------±-----------±-------------+
| player_id | device_id | event_date | games_played |
±----------±----------±-----------±-------------+
| 1 | 2 | 2016-03-01 | 5 |
| 1 | 2 | 2016-05-02 | 6 |
| 2 | 3 | 2017-06-25 | 1 |
| 3 | 1 | 2016-03-02 | 0 |
| 3 | 4 | 2018-07-03 | 5 |
±----------±----------±-----------±-------------+

Result 表:
±----------±------------+
| player_id | first_login |
±----------±------------+
| 1 | 2016-03-01 |
| 2 | 2017-06-25 |
| 3 | 2016-03-02 |
±----------±------------+

答1:

select player_id,min(event_date) first_login
from activity
group by player_id

2、游戏玩法分析2

请编写一个 SQL 查询,描述每一个玩家首次登陆的设备名称

查询结果格式在以下示例中:

Result table:
±----------±----------+
| player_id | device_id |
±----------±----------+
| 1 | 2 |
| 2 | 3 |
| 3 | 1 |
±----------±----------+

答2:

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)

3、游戏玩法分析3

编写一个 SQL 查询,同时报告每组玩家和日期,以及玩家到目前为止玩了多少游戏。也就是说,在此日期之前玩家所玩的游戏总数。详细情况请查看示例。

查询结果格式如下所示:

Result table:
±----------±-----------±--------------------+
| player_id | event_date | games_played_so_far |
±----------±-----------±--------------------+
| 1 | 2016-03-01 | 5 |
| 1 | 2016-05-02 | 11 |
| 1 | 2017-06-25 | 12 |
| 3 | 2016-03-02 | 0 |
| 3 | 2018-07-03 | 5 |
±----------±-----------±--------------------+
对于 ID 为 1 的玩家,2016-05-02 共玩了 5+6=11 个游戏,2017-06-25 共玩了 5+6+1=12 个游戏。
对于 ID 为 3 的玩家,2018-07-03 共玩了 0+5=5 个游戏。
请注意,对于每个玩家,我们只关心玩家的登录日期。

答3:

select player_id,event_date, sum(game_played) over (partition by player_id oder by event_date) games_played_so_far from Activity

解1题思路是建立分区函数,根据id分区,然后对日期排序,对已经玩过的游戏进行求和。

4、游戏玩法分析4

编写一个 SQL 查询,报告在首次登录的第二天再次登录的玩家的比率,四舍五入到小数点后两位。换句话说,您需要计算从首次登录日期开始至少连续两天登录的玩家的数量,然后除以玩家总数。

Result table:
±----------+
| fraction |
±----------+
| 0.33 |
±----------+
只有 ID 为 1 的玩家在第一天登录后才重新登录,所以答案是 1/3 = 0.33

答4:

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) 

注意别漏了round的参数2,distinct后不用括号,计数用count,别被sum搞混了。

5、员工薪水中位数

Employee 表包含所有员工。Employee 表有三列:员工Id,公司名和薪水。

±----±-----------±-------+
|Id | Company | Salary |
±----±-----------±-------+
|1 | A | 2341 |
|2 | A | 341 |
|3 | A | 15 |
|4 | A | 15314 |
|5 | A | 451 |
|6 | A | 513 |
|7 | B | 15 |
|8 | B | 13 |
|9 | B | 1154 |
|10 | B | 1345 |
|11 | B | 1221 |
|12 | B | 234 |
|13 | C | 2345 |
|14 | C | 2645 |
|15 | C | 2645 |
|16 | C | 2652 |
|17 | C | 65 |
±----±-----------±-------+
请编写SQL查询来查找每个公司的薪水中位数。挑战点:你是否可以在不使用任何内置的SQL函数的情况下解决此问题。

±----±-----------±-------+
|Id | Company | Salary |
±----±-----------±-------+
|5 | A | 451 |
|6 | A | 513 |
|12 | B | 234 |
|9 | B | 1154 |
|14 | C | 2645 |
±----±-----------±-------+

答5:

Select Id,Company,Salary from(select Id,Company,Salary,row_number() over (partition by Company order by Salary ) as rnb, count(Salary) over (partition by Company ) as trnb from Employee) t where rnb in (trnb/2,trnb/2+1,trnb/2+0.5) 

注意where的条件最后写。

解5题思路是:找中位数思路,先分区,对需要找中位数的列进行排序,找出row_number。然后再找出每个分区的总行数trnb,用count任意变量即可,最后选出row_number在cnt/2、cnt/2+1,或者cnt/2+0.5 这三个数的行即可。因为当总行数为偶数时,中位数的row_number为cnt/2和cnt/2+1;奇数时为cnt/2+0.5

数据来源:力扣网站:https://leetcode-cn.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值