![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
单挑力扣SQL笔试题
文章平均质量分 52
小_强
10年+数据架构师。专注于数据仓库、大数据、数据分析领域。
展开
-
单挑力扣(LeetCode)SQL题:180. 连续出现的数字(难度:中等)
如果一个数字是一个区间的开始值,那么这个数字-1一定不在集合中;相应的,如果一个数字是一个区间的结束值,那么这个数字+1一定不在集合中;那么,如果基于第三种特性直接计算,是不行的。当然,我们也可以基于第二种特性,计算出每个区间的开始值和结束值,然后再计算出连续的个数。我们可以使用开窗函数,在组内构建一个序号,这样就可以保证“值-它的序号”是相同的了。:一个有序的集合,如果某几个值是连续的,那么这几个值-它的序号一定是相同的;:一个有序的集市,错位相减,可以得到区间的开始值和结束值;原创 2024-01-02 20:58:23 · 686 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:1532. 最近的三笔订单(难度:中等)
当然,题目要求,查询出的结果遵守一定的排序规则。这并不难,按照要求做一次排序,然后返回,就完成了。那么,很明显,我们需要根据客户来开窗;然后计算出每个客户每一笔交易的序号。虽然被标记为一道中等题目,但实际上,这只能算一道窗口函数的基本应用题。题目要求,取出每个客户按时间排序最近的前3笔订单。最后,再跟客户信息表关联,取出客户姓名即可。接着,根据序号,取出每个客户的前3笔订单。原创 2024-01-02 20:56:50 · 654 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:1949. 坚定的友谊(难度:中等)
不过,这里需要注意的一点是,在使用笛卡尔积生成两两关系后,需要把两两之间不是好友的数据排除掉(如果1和2本身就不是好友,那么也就不需要计算他们之间共同的好友了)。也就是说,在题目1951中,1关注了2,但2不一定关注了1。而本题中,1和2是好友,同时,2和1当然也是好友。不一样的是,在原始业务场景下,题目1951的关系是单向的。而本题的关系是双向的。既然关系是双向的,那么我们在处理之前,是不是可以把双向的关系都生成出来呢?剩下的解题思路,就和题目1951相同了。都是计算两两之间的交集的个数。原创 2024-01-02 20:55:33 · 605 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:1709. 访问日期之间最大的空档期(难度:中等)
使用语法为:lead(column_name,n,default_value)。对于一个日期,它的下一个日期,必定是比它大的所有日期里的最小日期;同样的,它的上一个日期,必定是比它小的所有日期里的最大日期;不过,强哥今天介绍另一种方法,使用分析函数:lead。比如,可以使用如下SQL取出每一个日期的下一个日期。本题要求计算出一串日期中,间隔时间最大的天数。1、取出每一个日期的上一个日期或者下一个日期;如果第n个值不存在,还支持设置默认值。column_name:要取值的字段;n:向下取的值的序号;原创 2023-12-29 23:29:57 · 560 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:1951. 查询具有最多共同关注者的所有两两结对组(难度:中等)
再比如,用户1和2的结果会出现(1,2)和(2,1)两个组合,而两个组合的共同关注数是一样的。如果把表Relations做自关联,不带关联条件的话,那么就实现了两两结对,然后分别算出每一对的共同关注数,并取出共同关注数最大的那一对,是不是就可以了?比如,1的关注者(1,3),(1,4),(1,5)与2的关注者(2,3),(2,4),(2,6)的共同关注数怎么计算呢?上面的SQL,可以计算出两两用户之间的共同关注数,有了这个结果,相信再排序得出共同关注数最多的组合,就不是什么难事了。原创 2023-12-28 22:00:46 · 414 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:534. 游戏玩法分析 III(难度:中等)
既然题目要求,计算某一天之前所有的games_played之和,那么是不是可以将这天之前的记录,都归集到这一天来,然后再汇总求和呢?这样就能把每一个玩家,每一个event_date之前的记录归集到这一天来了。本题68.17%的通过率,难度中等。一般稍微思考一下,就能找到思路。不过,怎么将这天之前的记录,都归集到这一天?之后的汇总统计就比较简单了。原创 2023-12-27 23:50:08 · 678 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:1285. 找到连续区间的开始和结束数字(难度:中等)
如果一个数字是一个区间的开始值,那么这个数字-1一定不在集合中;相应的,如果一个数字是一个区间的结束值,那么这个数字+1一定不在集合中;所以,这道题,对于会的小伙伴,很简单;对于求连续区间的问题,过几天我会专门出一篇推文进行详细的解说。:一个有序的集合,如果某几个值是连续的,那么这几个值-它的序号一定是相同的;对于求连续区间,有几种常见的方法,都是基于连续区间的特性来进行计算的。下面的参考答案,是基于第三种特性给出的,是SQL写起来最简洁的一种。:一个有序的集市,错位相减,可以得到区间的开始值和结束值;原创 2023-12-27 23:48:17 · 670 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:178. 分数排名(难度:中等)
这仍然是一道分组排序题,题目本身也不复杂。因为要求分组内排序的序号连续且相同的值有相同的序号,使用dense_rank分析函数即可。对于关键字作为字段名使用,倒也不是完全不可以,但还是建议尽量不要使用。像这道题,就报出了莫名其妙的错误。当然,如果非得要用关键字作为字段名返回,需要在字段名两边加上反单引号。最后看到要求返回的序号的字段名rank,才想起来这是一个关键字。第一次提交失败,检查了好几遍,没发现哪里写的有问题。坦白说,强哥也折在这里了。第二次提交才通过的。比如,`rank`。原创 2023-12-25 21:02:52 · 672 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:1596. 每位顾客最经常订购的商品(难度:中等)
第二步,我们需要将第一步的结果,按顾客分组,然后以商品的购买次数进行排序(如果购买次数相同,则排序序号相同),取出序号为1的结果即可。那么,第一步,我们需要计算出,每个顾客每个商品的购买次数。这很简单,直接对订单表(Orders)按顾客+商品分组汇总即可。虽然题目看着很长,很唬人,但明显又是一道典型的分组排序题目,只不过排序的值需要预先计算出来。最后,再根据product_id关联出product_name即可。根据题目要求,计算出每个顾客最经常购买的商品(购买次数最多)。原创 2023-12-25 21:01:11 · 578 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:1549. 每件商品的最新订单(难度:中等)
当然,作为平时个人技术提升的练习题,也是非常不错的。正所谓实践出真知,学完书本的知识,很多时候也只能做到知道,距离熟练的应用还差的很远。相信很多学习SQL的小伙伴都面临这样的困境,学习完书本上的SQL基础知识后,一方面想测试下自己的水平;针对这类分组内排序后取前N名的需求,有三个分析函数可以使用,分别是:row_number、rank、dense_rank。,先计算出每个产品每个订单日期的排名(倒序),如果最新的日期内有多笔订单,则需要全部返回。》一样,这道题考查的也是分组内排名,然后返回前N名的写法。原创 2023-12-24 22:02:10 · 619 阅读 · 1 评论 -
单挑力扣(LeetCode)SQL题:1077. 项目员工 III(难度:中等)
当然,作为平时个人技术提升的练习题,也是非常不错的。正所谓实践出真知,学完书本的知识,很多时候也只能做到知道,距离熟练的应用还差的很远。相信很多学习SQL的小伙伴都面临这样的困境,学习完书本上的SQL基础知识后,一方面想测试下自己的水平;首先,通过Project与Employee的关联,获取每下项目下所有项目成员的经验年数;然后,通过分析函数,计算出每个项目下每个项目成员的经验年数排名;:排名相等的情况下返回相同的排名,但排名结果不会有断档。:排名相等的情况下返回相同的排名,但排名结果会有断档。原创 2023-12-24 22:00:38 · 483 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:1501. 可以放心投资的国家(难度:中等)
(虽然一条通话记录,需要分别计算到打出方和接收方,但因为所有通话记录都需要重复计算1次,所以在通话记录表直接使用avg聚合函数算出来的结果也是正确的)正所谓实践出真知,学完书本的知识,很多时候也只能做到知道,距离熟练的应用还差的很远。相信很多学习SQL的小伙伴都面临这样的困境,学习完书本上的SQL基础知识后,一方面想测试下自己的水平;从题目以及上图可以了解到,Calls表记录的是每一条通话记录,包括通话双方的人员ID、通话时长。我之前的工作中,有碰到一些同事,只要看到表比较多就懵了,不知道怎么下手。原创 2023-12-24 21:59:00 · 926 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:1308. 不同性别每日分数总计
首先,题目里描述scores表的主键是(gender, day),但实际上,表里还有一个player_name的字段,难道每天同一个性别只有一个player(当然题目中给出的样例数据确实是这样,虽然跟实际情况可能不太相符)?具体到这道题,上面的SQL已经计算出了每天每个gender的汇总值,那么再将每一天的数据发散到所有比它大的日期上,最后再以gender+day分组汇总即可。根据题目下面的解释,可以知道,这个“总分”,其实是从最开始日期累计到当天的总分,而不仅仅是当天的分数加总。思路上,一般来说,都是。原创 2023-12-24 21:57:03 · 603 阅读 · 0 评论 -
单挑力扣(LeetCode)SQL题:1303. 求团队人数
如果你也理解不了,不妨把自己叫做a表,再复制一个自己,叫做b表,然后a表与b表关联,这样就是两张不同的表关联,就好理解了。其实,对于team_size,也可以从每个员工的team_id出发,关联出这个team_id下所有的员工,然后使用employee_id做分组汇总,取出分组下的数据条数即可。具体到这道题,因为来源表员工表的主键是employee_id,而结果的主键也是employee_id,并且是所有员工的数据都要有。正所谓实践出真知,学完书本的知识,很多时候也只能做到知道,距离熟练的应用还差的很远。原创 2023-12-24 21:27:11 · 568 阅读 · 0 评论