Leetcode SQL会员题【吐血总结~~】第三天
目录
1097. 游戏玩法分析 V
1098. 小众书籍
1107. 每日新用户统计
1112. 每位学生的最高成绩
1113. 报告的记录
1126. 查询活跃业务
1127. 用户购买平台
1132. 报告的记录 II
1142. 过去30天的用户活动 II
1149. 文章浏览 II
1159. 市场分析 II
1164. 指定日期的产品价格
1097. 游戏玩法分析 V **
注:2022年阿里春招实习大数据开发岗位笔试第一题就是留存率
- 源代码:
with install_dt as (select player_id, min(event_date) dtfrom activitygroup by player_id ) select dt as install_dt, count(*) as installs, round(count(event_date) / count(*), 2) as day1_retention from install_dt left join activity on install_dt.player_id = activity.player_id and datediff(activity.event_date, install_dt.dt) = 1 group by dt;
- 思路:这个题目和留存率的题目很像,但是这个题目是简化了的,就是只用求每个玩家第一天登录日期的次日留存;拿到这个题目,我首先就求出了每个玩家第一天登录日期是多少,然后再拿这张临时表去和源表进行join,注意这个join一定是left join,因为很有可能只是第一天登录了,后面就没有登录过了,限制条件除了id相同之外,就是限制 次日登录了,也就是两张表的日期间隔为1,当然我们也可以在join之后,去
select
中去利用count(case when...)
计算也是可以的。
1098. 小众书籍
- 源代码:
select t1.book_id, name from (select book_id, namefrom bookswhere available_from < '2019-05-23' ) t1 left join (select order_id, book_id, quantityfrom orderswhere dispatch_date between '2018-06-23' and '2019-06-23' ) t2 on t1.book_id = t2.book_id group by t1.book_id having ifnull(sum(quantity), 0) < 10;
- 思路:首先注意到有两个条件可以先过滤一下,一个是 上架时间不满一个月,第二个是 订单时间过去一年内**(做SQL就应该这样先把简单的写出来,然后再继续分析)**,那么就还剩下一个条件,订单总量小于10,这也很简单,但是我开始出错了,就是在进行过滤的时候,没有写
ifnull
导致null
没有被考虑,也就是如果上架的书一个订单都没有,我们sum
之后是一个null值,而不是0,所以需要进行处理然后和10进行比较,否则就会出错
1107. 每日新用户统计
- 源代码:
with first_tmp as (select user_id, min(activity_date) first_loginfrom trafficwhere activity = 'login'group by user_id ) select first_login login_date, count(*) user_count from first_tmp where first_login between date_sub('2019-06-30', interval 90 day) and '2019-06-30' group by first_login
- 思路:这个题目就关注两个条件,一个是 用户第一次登陆,还有一个是 第一次登陆时间在90天内,然后聚合就可以了
1112. 每位学生的最高成绩
- 源代码:
select student_id, course_id, grade from (select student_id, course_id, grade, row_number() over(partition by student_id order by grade desc, course_id) rkfrom enrollments ) t where t.rk = 1 order by student_id;
- 思路:这个题目特别明显是一个分组排序的问题,唯一需要注意的是 开窗函数中排序条件有多个,这一点我一开始是忽略了的,因为之前没有写过多个排序条件的开窗函数
1113. 报告的记录
- 源代码:
select extra report_reason, count(distinct post_id) report_count from actions where action_date = '2019-07-04' and action = 'report' group by extra
- 思路:弄清楚过滤条件就可以了,另外还需要注意对
post_id
进行去重
1126. 查询活跃业务
- 源代码:
with avg_tmp as (select event_type, avg(occurences) avg_occfrom eventsgroup by event_type ) select business_id from events join avg_tmp on events.event_type = avg_tmp.event_type where occurences > avg_occ group by business_id having count(*) >= 2;
- 思路:需求拆解完就很简单了,也就是先求每个时间类型的平均发生次数,建立中间表,然后和源表进行join,判断条件为:发生次数大于平均发生次数,最后分组聚合,并且判断该业务至少出现2次
1127. 用户购买平台
- 源代码:
select t1.spend_date, t1.platform, coalesce(sum(total_amount), 0) as total_amount, coalesce(count(user_id), 0) as total_users from (select distinct spend_date, 'desktop' as platform from spendingunion select distinct spend_date, 'mobile' as platform from spendingunionselect distinct spend_date, 'both' as platform from spending ) t1 left join (select user_id, spend_date, case when count(platform) = 2 then 'both' else platform end as platform,sum(amount) as total_amountfrom spending group by user_id, spend_date ) t2 on t1.spend_date = t2.spend_date and t1.platform = t2.platform group by spend_date, platform
- 思路:我们首先应该求出上面的
t2
表,这就是一个分组聚合而已,主要需要清楚按照什么进行分组,聚合字段是什么;因为不管如何,我们都需要输出每种可能,所以我们先构建一张t1
表,来和t2
表进行left join
,t2
表中不存在的返回0就可以了 - 难点:经过了两次分组聚合,分组字段不同;根据题目案例的输出格式需要想到要构建一张所有可能的临时表。
1132. 报告的记录 II
- 源代码:
select round(avg(rate) * 100, 2) as average_daily_percent from (select action_date, count(distinct removals.post_id) / count(distinct actions.post_id) as ratefrom actions left join removalson actions.post_id = removals.post_idwhere extra = 'spam'group by action_date ) t
- 思路:这个题目使用
left join
非常的巧妙,我是分开进行计算的,题解是直接一个语句就写出来了;另外还需要注意对post_id
进行去重,因为重复的不用计算。
1142. 过去30天的用户活动 II
- 源代码:
select ifnull(round(avg(times), 2), 0) as average_sessions_per_user from (select user_id, count(distinct session_id) as timesfrom activitywhere datediff('2019-07-27', activity_date) < 30group by user_id ) t
- 思路:本题难点在于一些函数的时候用,比如
datediff
可以求出两个日期之间相差的天数
1149. 文章浏览 II
- 源代码:
select distinct viewer_id as id from (select *from viewsgroup by article_id, author_id, viewer_id, view_date )t group by viewer_id, view_date having count(*) >= 2 order by viewer_id
- 思路:主要是中间需要对数据表进行去重,也就是按照所有字段进行分组
1159. 市场分析 II
- 源代码:
select users.user_id seller_id, case when seller_id is null then 'no' else 'yes' end 2nd_item_fav_brand from users left join (select t.seller_id, item_brandfrom (select seller_id, item_id, row_number() over(partition by seller_id order by order_date) rkfrom orders) tjoin items on t.item_id = items.item_idwhere rk = 2 ) t on users.user_id = t.seller_id and t.item_brand = users.favorite_brand;
- 思路:首先就是获得第二名的卖家id,和品牌名称,然后和用户表进行join,条件是用户id等于卖家id,并且品牌名称是自己喜欢的品牌
1164. 指定日期的产品价格
- 源代码:
select p.product_id, ifnull(new_price, 10) as price from (select distinct product_idfrom products ) p left join (select product_id, new_pricefrom productswhere (product_id, change_date) in (select product_id, max(change_date)from productswhere change_date <= '2019-08-16'group by product_id) ) t on p.product_id = t.product_id
- 思路:我们要拿到日期小于等于
2019-08-16
的商品id和最新的价格(最新也就是日期要是最大的),然后从原始表中取出所有的商品id,和它进行left join
,如果对应的价格为空值,就取默认值10
Leetcode SQL会员题【吐血总结~~】第三天相关推荐
- Leetcode SQL 刷题 Mysql【2】
[11]595. 大的国家 select name,population,area from World where area > 3000000 or population > 2500 ...
- LeetCode SQL 刷题
文章目录 MySQL配置 数据库准备 1. 大国 2. 换座位 2.1 solution-1 2.2 solution-2 3. 交换工资 solution-1 4. 有趣的电影 solution 5 ...
- lead 函数 ——《访问日期之间最大的空档期》LeetCode Plus 会员专享题【详细解析】Hive / MySQL
大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师.欢迎大家跟我一起走进数据分析的世界,一起学习! 感兴趣的朋友可以关注我的数据分析专栏,里面有许多优质的文章跟大家分享哦. 另外也欢迎大家 ...
- 刷题汇总(三)leetcode 精选50题 C++答案总结
题目来源 腾讯精选练习(50 题) 相关: 刷题汇总(一)leetcode 精选50题 JavaScript答案总结 刷题汇总(二)剑指Offer 66题 C++答案总结 刷题汇总(四)技术类编程题汇 ...
- 牛客网SQL刷题笔记(MySQL)
牛客网SQL刷题笔记(MySQL) 此博客集合LeetCode.牛客网常见的题型及其解法,侵删 目录 牛客网SQL刷题笔记(MySQL) 类型1:查找排名第几的数据 SQL2 查找入职员工时间排名倒数 ...
- LeetCode(SQL)难度-中等
LeetCode(SQL)难度-中等 注:排名知识点(题目1->思路来源于牛客-小数志(公众号)) 连续排名,例如3000,2000,2000,1000排名结果为1-2-3-4,体现同薪不同名, ...
- 【Leetcode】 刷题之路1(python)
leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...
- 15.使用一样的BFS方法(代码几乎一模一样)解决多道LeetCode题目--542题(01矩阵)1765题(地图中的最高点)994腐烂的橘子
一.综述 本文总结自己刷LeetCode中遇到的使用BFS方法解决相同类型的题目.(代码几乎是一模一样) 二.01矩阵(LeetCode第542题) class Solution {int[][] d ...
- leetcode贪心算法题集锦(持续更新中)
leetcode贪心算法题集锦 leetcode贪心算法题集锦(持续更新中).python 和C++编写. 文章目录 leetcode贪心算法题集锦 一.贪心算法 1.盛最多水的容器 2.买股票的最佳 ...
最新文章
- linux环境下和网络服务相关的配置文件含义及如何配置
- asp.net过滤HTML标签的几个函数
- 300*4=1200
- 解决小米手机无法收到开机广播的问题
- 如何成为有效学习的高手(许岑)——思维导图
- Java命令行界面(第21部分):航空公司2
- jmeter 压测duobbo接口,施压客户端自己把自己压死了
- Flume将A服务器上的日志实时采集到B服务器
- python locust 性能测试:HOOKS钩子方法
- Quartz2D使用(截屏)
- 通过Android上的意图启动Google地图路线
- MSSQL 事务,视图,索引,存储过程,触发器
- 营业执照生成_0跑动,3步注册,48小时拿证!金山发出首张全程电子化登记营业执照!...
- Dijkstra算法结合时间窗规划无冲突路径
- Smail语法(1)
- 中继器,集线器,网桥的区别
- 换个服务器后网页加载很慢,打开网页很缓慢?换个DNS轻松解决问题
- Cloudera Manager5.14.3集群搭建
- python之HTML-块级标签
- 【巴马火麻茶】调节三高、治疗失眠、排毒减肥,轻松get长寿的秘密!