
力扣数据库题
铁锤2号
干啥啥不会~
展开
-
leetcode---sql题-----casewhen合集
1435制作会话柱状图题解:首先我们需要使用case when将不同的时间区分开来select session_id,case when duration >= 900 then '15 or more'when duration >= 600 then '[10-15>'when duration >= 300 then '[5-10>'when duration >= 0 then '[0-5>'end totalfrom Sessions原创 2021-06-19 11:45:13 · 313 阅读 · 0 评论 -
1355. 活动参与者---inner join 或窗口函数
活动参与者题目分析:题目要求出不是最多也不是最少人参加的活动,那咱们直接排除就好了。排除方法有两种,一种可以是使用limit 限制,然后取交集,即inner join。还有一种就可以使用dense_rank()解法一select F1.activity from (select activity from Friends group by activity having count(*) != (select count(*) num from Friends group by activity o原创 2021-06-01 12:33:50 · 139 阅读 · 0 评论 -
leecode 1549. 每件商品的最新订单----dense_rank()
每件商品的最新订单题目分析:题目要求找到每件商品的最新订单,但是这个最新是按日来算的,所以可能会当日存在两个订单,那么如果使用order by和limit就可能不行,因此需要窗口函数dense_rank()先找出每件商品的最新订单select product_id,order_id,order_date from (select product_id,order_id,order_date,dense_rank() over(partition by product_id order by orde原创 2021-05-31 12:25:50 · 173 阅读 · 0 评论 -
leetcode 608. 树节点-union的使用
树节点题目分析:才开始一看还以为是编程题,结果不是,哈哈这题主要还是用union,针对不同的类型进行筛选后连接整个过程如下#根节点#根节点select id Id,"Root" as Type from tree where p_id is null union#叶子节点select id Id,"Leaf" as Type from tree where id not in (select ifnull(p_id,-1) from tree) and p_id is not nullu原创 2021-05-25 12:31:52 · 288 阅读 · 0 评论 -
leetcode 570. 至少有5名直接下属的经理
至少有5名直接下属的经理题目分析:表中给了职员以及职员的经理是谁,要找出至少有5名下属的经理。首先可以找出至少有5名下属的经理的ManagerId。select ManagerId from Employee where ManagerId is not null group by ManagerId having count(*) >=5接着通过查找出的ManagerId进行筛选就可以了select name from Employee where Id in (select Mana原创 2021-05-25 12:13:49 · 204 阅读 · 0 评论 -
leetcode 612. 平面上的最近距离-----数学函数的集体使用
平面上的最近距离题目分析:题目要求的就是两个点之间的最短距离,我们可以先使用inner join 将x,y的坐标连接在一起,然后进行计算就行了先将x和y连接在一起select * from point_2d p1 inner join point_2d p2 on p1.x != p2.x and p1.y != p2.y;tips:这个地方inner join后面是加了条件判断的,坐标要满足相应的要求才可以连接,注意使用的是or而不是and,因为两个点只要有一个不一样那就是不同的点。接着计算原创 2021-05-24 12:22:38 · 255 阅读 · 0 评论 -
leetcode 1364. 顾客的可信联系人数量----两种解法更新
顾客的可信联系人数量题目分析:这题的题目读起来就很复杂,下面我们来简单拆解一下。题目给了这几张表这是一张顾客表,其中customer_id存储的是顾客的唯一标识id。同时customer_name和email是这位顾客的名字和邮箱。这是一张联系表,存储的是顾客的联系人信息。什么叫顾客的联系人信息?和商店给顾客顾客安排售后联系人一样,一个顾客可能有好几个联系人,看下面这张存储了联系人信息的contacts表。上面这张表的含义是user_id为1的客户有三个联系人,分别是Bob,John,Jal原创 2021-05-18 12:30:16 · 560 阅读 · 2 评论 -
leetcode 534. 游戏玩法分析 III----窗口函数sum
游戏玩法分析 III题目分析:题目的要求写的很清楚,同时报告每组玩家和日期,以及玩家到目前为止玩了多少游戏。也就是说,在此日期之前玩家所玩的游戏总数。按照玩家的先id后时间的顺序进行排序后逐渐求和就行了select player_id,event_date,sum(games_played) over(partition by player_id order by event_date) games_played_so_far from Activity;提交结果如下...原创 2021-05-13 12:20:23 · 279 阅读 · 0 评论 -
leetcode 626. 换座位---使用if分类讨论
换座位又是一题看了答案才会的题,而且这题出现的几率还是蛮高的。题目分析:题目给的表是这样的,题目要求把邻近的座位互换,也就是1和2的座位互换,3和4座位互换,5没有互换的了,就不用换了。才看起来,感觉完全没法上手,这没法解啊。我们从结果反推。我们想要的结果应该是这样的idstudent1Doris2Abbot3Green4Emerson5Jeams这样看起来还是不知道怎么做,我们再转换下结果的表idstudent原创 2021-05-13 12:15:07 · 198 阅读 · 0 评论 -
leetcode 1126. 查询活跃业务
查询活跃的业务题目分析:查询活跃的业务有两个条件,第一个是业务的某个事件类型的发生次数大于此事件类型在所有业务中的平均发生次数,第二个是该业务至少有两个这样的事件类型,那么该业务就可被看做是活跃业务。按照这个要求逐步筛选即可先筛选第一个条件select business_id,E.event_type from Events E inner join (select event_type,sum(occurences)/count(*) ave_occ from Events group by ev原创 2021-05-12 12:36:22 · 206 阅读 · 0 评论 -
leetcode 1440. 计算布尔表达式的值---case when配合if
计算布尔表达式的值题目分析:题目中给了两张表,一张是x和y的值是多少,还有一张是x和y之间的关系,要求根据这两张表给出true或者false。首先如果光有x和y而没有对应的值肯定不能进行比较,所以我们先得连接x和y对应的值,这个地方注意,不能使用inner join而应该使用left join。接着要使用case when来判断两个变量的关系,而且需要根据给的符号的不同分别给出结果。先进行连接得出最后要使用的表select V1.value value1,E.*,V2.value value2 f原创 2021-05-12 12:23:42 · 263 阅读 · 0 评论 -
leecode-1747. 应该被禁止的Leetflex账户---神奇的inner join和between and搭配使用
应该被禁止的Leetflex账户(这题真的是第一次不会,现在还是不会,最后看了别人的答案才会的)题目分析:题目给了用户的id,用户的ip地址以及用户在这个ip上登录和登出的时间,表中的数据是有在同一时间段同时在两个设备上登录的信息的,要求查出同时登录的id。这题上来真的是完全没有思路,后来想到的是对比时间,但是拿啥对比呢?看了别人的答案才知道使用between and 可以对比。我们来看看具体的解决思路首先是inner join自连接,然后使用between and来对比时间。这个时候使用的条件应该是原创 2021-05-11 12:19:50 · 487 阅读 · 0 评论 -
leetcode 1709. 访问日期之间最大的空档期---窗口函数lead
访问日期之间最大的空档期题目分析:题目要求按照不同的id计算出空档期,当前最新的时间是2021-01-01.简单来说,就是按照日期进行排序后计算前后日期之间差距。我们可以使用lead函数把后面的日期往前移动一下,然后计算出日期之间的差距即可。同时注意,如果将日期往前移动,会造成id下面的最后日期配对的日期为null,好在lead函数可以设置默认值。先把数据往前提一格select user_id,visit_date,lead(visit_date,1,'2021-01-01') over(partit原创 2021-05-10 12:26:11 · 379 阅读 · 0 评论 -
leetcode 1077. 项目员工 III----dense_rank()
项目员工iii题目分析:题目给了员工的编号,项目的编号,要求找出项目中经验最多的人,这里面注意的是,最多的人可能不止一个。按照项目分类,使用dense_rank()排序即可。先连接两张表select P.project_id,P.employee_id,E.experience_years from Project P inner join Employee E on P.employee_id = E.employee_id再使用dense_rank()编号select *,dense_ran原创 2021-05-08 12:22:29 · 187 阅读 · 0 评论 -
leetcode 1204. 最后一个能进入电梯的人---窗口函数求和,limit
最后一个能进入电梯的人题目分析:题目的意思非常简单,就和我们平时上电梯一样,人按顺序一个一个进去,求最后能上电梯的人是谁。题目给了进去的顺序和每个人的体重,那么我们直接按照顺序累积求和就可以了。按照顺序累积求和可以使用sum搭配窗口函数使用先按照顺序求和select person_id,person_name,weight,sum(weight) over(order by turn) s_weight from Queue接着按照求和的数字筛选,然后倒序排列,选取第一个人的名字即可select原创 2021-05-08 12:14:21 · 884 阅读 · 0 评论 -
leetcode1468计算税后工资--if的嵌套使用和round配合使用
1468计算税后工资题目分析:题目给了限定条件,不同情况下的工资是不同的,现在要求算出给定的表的税后的工资是多少。我们可以先给不同级别的公司定好对应的级别,然后按照级别进行分类计算就好了。首先定好级别,使用if进行嵌套判断select company_id,if(max(salary)<1000,"L",(if(max(salary)>10000,"H","M"))) type from Salaries group by company_id;接着和salaries表进行inner原创 2021-05-06 12:40:40 · 1147 阅读 · 0 评论 -
leetcode 1613找到遗失的ID--使用cte
找到遗失的id题目分析:这题就是的意思很简单,就是找到连续数字里面缺失的数据。想要找到缺失的数据就得恢复原来的数据,所以题目可以使用cte表达式生成这个数据,然后直接使用not in找出不在其中的数据with recursive cte(customer_id) as (select 1union allselect customer_id+1 from cte where customer_id < (select max(customer_id) from Customers))se原创 2021-05-06 12:15:49 · 309 阅读 · 0 评论 -
1421. 净现值查询---left join + ifnull
净现值查询题目分析:题目给了一个Queries的表,要求查出QUeries表的对应时间和id的净现值,其实就是用这个表去左连接npv的表。同时要注意的是,对应id和year的npv如果不存在的话,使用0.那直接使用ifnull即可答案如下:select Q.id,Q.year,ifnull(N.npv,0) npv from Queries Q left join NPV N on Q.id = N.id and Q.year = N.year;提交结果如下:...原创 2021-04-26 12:25:52 · 493 阅读 · 0 评论 -
1308. 不同性别每日分数总计----窗口函数sum
不同性别每日分数总计题目分析:这题的要求是按照不同的性别计算日期从前往后的总分,总分在这个题目中的含义是当前日期之前的分数按照性别区分之和。看下面的表:求性别为F的2020-01-01之前的分数就应该是23+17+17=57.有这个分析后,我们可以采用窗口函数的sum来进行解决select gender,day,sum(score_points) over(partition by gender order by day) total from Scores;提交结果如下:...原创 2021-04-26 12:11:43 · 212 阅读 · 0 评论 -
leetcode 1811. Find Interview Candidates---窗口函数相减
Find Interview Candidates题目分析:题目的问题是翻译过来的意思就是:找出连续三场赢得奖牌的人或者赢得了三个金牌的人。给了contests和users两张表。首先第一个,找出赢得了三个金牌的人很简单,对gold_medel那一行进行group by即可select gold_medal from Contests group by gold_medal having count(*) >= 3;接着第二点,连续三场获得奖牌,这个就有点意思,首先contests表给的原创 2021-04-24 12:34:50 · 629 阅读 · 0 评论 -
1699. 两人之间的通话次数---if
两人之间的通话次数题目分析:表给的是两个人之间的通话记录,难点在意3-4和4-3打电话其实是算同一种的,解决好这个问题就解决了所有问题。这个地方题目还特地强调了可能存在重复数据,那么其中的两个3-4-200到底算不算重复数据呢?真是疑惑。首先使用if转换下数据,即把from_id都变成小的,to_id都变成大的select if(from_id>to_id,to_id,from_id) from_id,if(from_id>to_id,from_id,to_id) to_id,durati原创 2021-04-23 12:29:03 · 329 阅读 · 0 评论 -
leetcode 1398. 购买了产品 A 和产品 B 却没有购买产品 C 的顾客----group_concat
购买了产品 A 和产品 B 却没有购买产品 C 的顾客题目分析:要求找出选了AB两个产品,但是没有选C产品的顾客。很自然想到的一个方法是我直接group by后比较下不就行了。那么有group by后集合的函数吗?有,真有,group_concat先按照customer_id集合下数据select customer_id,group_concat(product_name) p_name from Orders group by customer_id接着筛选出符合条件的idselect cus原创 2021-04-22 12:30:45 · 200 阅读 · 0 评论 -
leetcode 1270 向公司CEO汇报工作的所有人----inner join
向公司CEO汇报工作的所有人题目分析:题目要求查出直接或者间接向CEO汇报的人,而且题目降低了难度,这种间接的关系肯定不会超过三个,那这就好办了,直接inner join 两次连接三张表筛选出每张表中manager_id=1的最开始的那张表的employee_id即可.注意,要排除CEO自己。select E1.employee_id from (select * from Employees where employee_id != 1) E1 inner join Employees E2 on E原创 2021-04-22 12:12:22 · 196 阅读 · 0 评论 -
leetcode Maximum Transaction Each Day---两种方法
Maximum Transaction Each Day题目分析:题目的意思很简单,要求查出每天的最大的交易数,注意的是,有些天数会同时存在多个最大值。思路可以是:首先筛选出对应日期的最大值,然后按照对应日期和最大值与原来的表进行inner join即可首先格式化一下时间,只需要日期select transaction_id,date_format(day,"%Y-%m-%d") f_day,amount from Transactions依据上面的结果取出每天的最大值select transa原创 2021-04-21 12:25:03 · 142 阅读 · 0 评论 -
leetcode 1285 找到连续区间的开始和结束数字---窗口函数的妙用
找到连续区间的开始和结束数字这题题目就给了一张表,题目非常的短,但是没有想好思路,实则非常难处理。这个地方我们可以使用窗口函数进行辅助解题。思路如下:logidrow_number()log_id-row_number()1102203307438531064通过上面的使用row_number()排名后再相减,我们能发现,连续的数字相减的结果是相同的,那么我们使用这个辅助列group 不要后求最大最小即可。首先先排名s原创 2021-04-20 12:33:11 · 609 阅读 · 0 评论 -
leetcode 1783 Grand Slam Titles---使用union
leetcode 1783 Grand Slam Titles题目分析:题目是英文的,但是看下几张表就知道题目的意思是想干什么。players表是运动员的id和运动员的nameChampionships是运动员每一年的四场比赛的第一名的id。题目想要求表中运动员一共的获奖情况。首先最重要的问题是列转行,我们可以直接使用union all进行,如下select Wimbledon player_id from Championships union allselect Fr_open from原创 2021-04-20 12:22:06 · 545 阅读 · 0 评论 -
leetcode 1445.苹果和橘子-inner join解
1445.苹果和橘子题目分析:题目要求求出苹果和橘子之间的差,那么只需要单独求出苹果和橘子的数量,然后inner join后相减即可先筛选苹果的数目select sale_date,fruit apples,sold_num from Sales where fruit LIKE 'apples'然后筛选橘子的数目select sale_date,fruit oranges,sold_num from Sales where fruit LIKE 'oranges'对结果进行inner jo原创 2021-04-19 12:24:40 · 273 阅读 · 0 评论 -
leetcode 1393 股票的资本损益-使用if转换数据
1393 股票的资本损益题目分析:这题让求的是股票从买入到卖出中间赚了多少钱。我们一眼看上去那个表,似乎没什么感觉,都是数字,但是当你想买入和卖出的时候,其实是一个+钱和一个-钱的过程,那么我们就能想的明白了,我们把买入的数字变成负的数据,卖出的保持不变即可。那么有没有这种处理方式呢?有,就是if先将price字段转换为买入的值为负select stock_name,if(operation="Buy",-price,price) price from Stocks注意上面的数据,当operati原创 2021-04-19 12:32:55 · 263 阅读 · 0 评论 -
leetcode数据库1517. 查找拥有有效邮箱的用户
https://leetcode-cn.com/problems/find-users-with-valid-e-mails/这题需要用到正则,在评论区看到了一位对sql的简单总结,记录下,算是巩固这题的题解为:select user_id,name,mail from Users where mail REGEXP '^[a-zA-Z][a-zA-Z0-9\_\.\-]*@leetcode\.com$';^表示以后面的字符为开头[]表示括号内的任意字母-表示连续*表示重复前原创 2021-02-05 21:00:45 · 421 阅读 · 0 评论 -
牛客网sql6解析--查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序
题目:查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序(请注意,一个员工可能有多次涨薪的情况)CREATE TABLE employees (emp_no int(11) NOT NULL,birth_date date NOT NULL,first_name varchar(14) NOT NULL,last_name varchar(16) NOT NULL,gender char(1) NOT NULL,hire_date date NOT原创 2021-01-14 14:17:15 · 333 阅读 · 0 评论 -
牛客网sql刷题记录
边写边更新。SQL1.查找最晚入职的员工的所有信息分析:题目直接告诉入职日期不是同一天,所以不用考虑重复等问题了。最晚入职的员工,我们可以先查找出最晚入职的员工的时间,然后hire_time等于这个时间就可以了。答案:select * from employees where hire_date = (select MAX(hire_date) from employees);SQL2.查找入职员工时间排名倒数第三的员工所有信息分析:首先看到倒数第三,很自然想到的就是of原创 2021-01-11 17:41:19 · 233 阅读 · 0 评论 -
LeetCode数据库题解176.第二高的薪水
分析:第二高的薪水我们可以考虑使用order by字句排序后直接offset截取一下就可以,所以我们可以这样使用:SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1但是这样结果是错的,因为还有个要求:如果不存在第二高的薪水,查询返回null。这一块可以直接使用ifnull的判断了。答案:SELECT IFNULL( (SELECT DI.原创 2021-01-08 12:33:35 · 137 阅读 · 0 评论 -
LeetCode数据库题解181.超过经理收入的员工
分析:这是一个自连接查询,因为joe的上司也在这个表中,首先我们先不关注员工的收入超过经理,我们先找出员工的经理,员工的经理即员工表的managerId,连接经理的Id,可以为select e.Name Employee from Employee e,Employee m where e.ManagerId = m.Id接着就是收入超过经理,直接e.Salary > m.Salary组合一下就是正确答案:select e.Name Employee from Employee e,.原创 2021-01-07 11:47:43 · 207 阅读 · 0 评论 -
LeetCode力扣数据库620.有趣的电影题解
分析:需要从cinema表中查找出description不为boring的而且id为奇数的影片,按照rating排列。重点是description不为boring 即description <> boring。id为奇数,即id%2 = 1。按照rating排列,即order by rating desc;答案:select * from cinema where description <> 'boring' and id%2 = 1 order by rating...原创 2021-01-04 20:06:52 · 340 阅读 · 0 评论 -
LeetCode力扣数据库题595.大的国家题解
分析:要求从world表中找出面积超过300万或者人口超过2500万的国家,重点是 300万,或者,2500万,或者就是or 300万和2500万需要转换为3000000和25000000.答案:select name,population,area from World where area > 3000000 or population > 25000000;结果为:...原创 2021-01-04 12:56:03 · 273 阅读 · 0 评论