leetcode上sql题刷题记录(2022-04-01)
511 游戏玩法分析 I
代码如下:
# 自己的错误代码
select player_id,event_date as first_login
from Activity group by player_id,event_date having min(event_date);
# 自己改进的代码
select player_id, min(event_date) as first_login
from Activity where player_id in (select distinct player_id
from Activity) group by player_id;
# 网上的代码
select player_id,min(event_date) first_login
from Activity
group by player_id;
解题思路:
先是找出题目的关键字 .....每位玩家.....第一次.....日期 每位玩家说明要根据玩家id分组,要用到group by 第一次,说明要获取分组后的数据日期最小的值
548-寻找用户推荐人
代码如下:
# 自己开始想到的解法
select name from customer
where referee_id !=2;
# 自己优化的解法 (网上说null不能直接用算术运算符进行比较)
select name from customer
where referee_id is null or referee_id !=2;
# 网上的解决方案 (null不能参与运算,但是''可以)
select name from customer
where ifnull(referee_id,'')!=2;
# 下面的语句同样错误 null不能直接用算术运算符进行比较 比较null用 is null 或者 IS NOT NULL
SELECT name FROM customer WHERE referee_id = NULL OR referee_id <> 2;
解题思路: 先抓关键字 不是 2 说明只需要判断推荐人id不等于2就行了, 但是这个题有隐藏的知识点 那就是 is null 和 is not null
586-订单最多的客户
代码如下:
# 开始的想法,但是提示我不能嵌套聚合函数
select count(order_number) as num ,customer_number from
Orders group by customer_number having max(num);
# 因为要用max()取最大值,于是想到了倒序后取第一个值,修改的d代码如下
select customer_number
from (select count(order_number) as num ,customer_number from
Orders group by customer_number order by num desc limit 1) as c;
解题思路 : 先抓关键字 ...最多订单 .... 说明要分组, 还要用到count 函数 分组是为了知道每位客户的下单情况 count是为了得到下单最多的用户 题目的意思是只要一个用户,说明还有用limit 取一个用户出来即为 limt 1