- 博客(139)
- 收藏
- 关注
原创 SQL 进阶小课堂:开窗函数与 GROUP BY 的关键细节
本文详细解析了SQL中GROUP BY与窗口函数的正确使用方法及常见误区。核心要点包括:1) 不使用GROUP BY时,聚合开窗的排序字段必须不同于聚合字段;2) 使用GROUP BY统计全局指标时,窗口函数不能加PARTITION BY分组字段;3) 统计组内指标时,不可混用GROUP BY和窗口函数同一维度。
2025-08-10 15:42:05
441
原创 Windows系统最高效的Shell脚本开发环境:VSCode+插件+Git
本文介绍了在Windows系统下使用VSCode高效开发Shell脚本的方法。首先需要下载安装VSCode和Git,然后在VSCode中配置ShellCheck(语法检查)和BashIDE(代码补全)两大核心插件。通过详细的图文教程,展示了如何利用这些工具实现语法错误检查、代码补全、自动修复等功能,并演示了在VSCode中调用Git Bash终端执行脚本的完整流程。这种配置方式让Windows用户能获得类似主流IDE的开发体验,同时兼顾跨平台操作需求,极大提升了Shell脚本的开发效率。
2025-07-31 16:25:07
733
原创 SQL学习指南及力扣SQL50题题解专栏介绍
本文介绍了力扣SQL刷题的学习路线和题解专栏。首先列出SQL学习的8大知识点,包括基础语法、字符串函数、日期函数、聚合与分组等,建议零基础者先补全相关知识再刷题。其次介绍了力扣高频SQL50题专栏,提供每道题的详细解析和分类导航,按难度分为入门、简单、中等三组,包含1757、584、197等典型题目链接,方便查阅练习。题解均经过验证通过,并重新标注了合理难度。
2025-07-29 15:48:35
1222
原创 详解力扣高频SQL50题之1517. 查找拥有有效邮箱的用户【简单】
题目要求筛选出有效邮箱的用户,邮箱需满足:前缀以字母开头,可包含字母、数字、下划线、点或破折号,域名必须为@leetcode.com。使用REGEXP_LIKE函数筛选出符合条件的用户记录。
2025-07-29 12:52:53
564
原创 详解力扣高频SQL50题之1327. 列出指定时间段内所有的下单产品【简单】
题目要求查询2020年2月下单数量不少于100的产品名称和总数量。通过连接Products和Orders表,筛选2020年2月订单数据,按产品分组汇总数量,并用HAVING过滤总数≥100的记录。最终返回产品名和对应总数量。
2025-07-29 12:02:07
607
原创 详解力扣高频SQL50题之1484. 按日期分组销售产品【简单】
题目要求统计每个销售日期中不同产品的数量及名称列表。需要先对产品去重,再按日期分组,计算产品数量并按字典序拼接产品名称。关键点包括:使用DISTINCT去重、用LISTAGG函数拼接字符串、按字典序排序,以及格式化日期输出。最终结果按销售日期排序。
2025-07-29 11:46:46
543
原创 详解力扣高频SQL50题之176. 第二高的薪水【中等】
这篇SQL题目解析讨论了如何查询第二高薪水的解决方案。文章指出可以使用DENSE_RANK()窗口函数来正确处理并列薪资的情况,相比普通排序方法更加简洁可靠。作者提供了标准SQL实现代码,并解释了为什么不能使用RANK()函数。此外还分析了题目中的潜在陷阱,包括空值处理和并列排名的特殊情况。最后提到这种方法同样适用于更复杂的三高薪水查询问题。
2025-07-29 11:08:10
350
原创 详解力扣高频SQL50题之196. 删除重复的电子邮箱【简单】
题目要求删除Person表中重复的电子邮件记录,只保留每个邮箱的最小id记录。通过编写DELETE语句,使用子查询找出每个邮箱的最小id,然后删除不在这些id中的记录即可。
2025-07-29 10:33:06
429
原创 详解力扣高频SQL50题之1527. 患某种疾病的患者【简单】
摘要 题目要求查询患I类糖尿病(代码以DIAB1开头)的患者信息。关键点在于疾病代码可能出现在字符串开头或中间(以空格分隔)。解决方案使用LIKE操作符匹配两种模式。
2025-07-29 10:18:27
296
原创 详解力扣高频SQL50题之1667. 修复表中的名字【简单】
这道SQL题目要求将用户名字格式化为首字母大写、其余小写的形式。解题思路是使用字符串函数:先用SUBSTR截取首字母转为大写,再截取剩余部分转为小写,最后用||拼接。标准SQL解法简单高效,需注意不同数据库的拼接语法差异。
2025-07-29 10:09:06
433
原创 详解力扣高频SQL50题之185. 部门工资前三高的所有员工【中等】
摘要 这道SQL题目要求找出每个部门中薪资排名前三的员工。使用DENSE_RANK()窗口函数可以完美解决,因为它能正确处理并列薪资的情况(如1,1,2的排名)。解题步骤:1)连接Employee和Department表;2)使用DENSE_RANK()按部门分组并按薪资降序排序;3)筛选排名≤3的记录。最终SQL简洁高效,核心在于正确应用窗口函数处理排名需求。
2025-07-29 09:52:19
502
原创 详解力扣高频SQL50题之585. 2016年的投资【中等】
题目要求筛选出2016年满足两个条件的投保金额总和:1)2015年投保额与他人相同;2)所在城市位置唯一。给出两种解法:方法一使用子查询,通过exists和in判断条件,直观但效率较低;方法二利用count()开窗函数,统计2015投保额和位置的出现次数,筛选出现次数≥2的城市和唯一位置的记录,效率更高。
2025-07-29 09:19:12
813
原创 详解力扣高频SQL50题之602. 好友申请 II :谁有最多的好友【中等】
文章摘要: 题目要求从RequestAccepted表中找出拥有最多好友的用户及其好友数量。提供了两种SQL解决方案:方法一通过子查询分别统计请求者和接收者的好友数量(count+子查询结果作为num),使用UNION ALL合并结果后取最大值;方法二更简洁,通过合并所有用户ID并统计出现次数来确定好友数量。两种方法最终都按好友数降序排序并取第一条记录。关键在于理解好友关系是双向的,需要同时统计作为请求者和接收者的出现次数。测试用例保证结果唯一。
2025-07-28 21:57:00
833
原创 详解力扣高频SQL50题之1321. 餐馆营业额变化增长【困难】
这篇文章讲解了一个SQL题目,要求计算餐馆7天移动平均消费额。题目需要分析顾客每日消费数据,计算每7天的消费总额和平均值。关键点是使用窗口函数中的ROWS BETWEEN语法来获取过去7天的数据范围。文章详细解析了窗口函数的使用方法,包括如何计算前7天的消费总和和平均值,并处理日期分组和排序问题。最终提供了Oracle的实现代码,包含日期格式化、窗口函数应用和结果筛选步骤。该题目考察了SQL窗口函数的高级应用,特别是时间范围计算能力。
2025-07-28 18:06:21
938
原创 详解力扣高频SQL50题之1341. 电影评分【中等】
这道题目要求完成两个查询任务:1)找出评论电影数量最多的用户(平局时取字典序小的);2)找出2020年2月平均分最高的电影(平局时取字典序小的)。解决方案使用SQL查询,先分别处理两个需求,再合并结果。第一个查询通过连接用户表和评分表,统计评论数并按规则排序;第二个查询连接电影表和评分表,计算2月平均分并按规则排序。关键点在于使用UNION ALL合并结果(而非UNION),以避免同名电影和用户导致的数据丢失。
2025-07-28 16:43:39
583
原创 详解力扣高频SQL50题之626. 换座位【中等】
本文介绍了三种SQL解法来解决LeetCode 626题"换座位"问题。题目要求交换连续两个学生的座位号,奇数个学生时不交换最后一个。方法一使用CASE WHEN和子查询修改student列;方法二通过修改id列并排序实现;方法三利用LEAD()和LAG()窗口函数移动行数据。三种方法各有特点,其中窗口函数解法最为直观。文章提供了每种方法的SQL代码实现,并简要说明了其思路和适用场景。
2025-07-28 15:41:08
691
原创 详解力扣高频SQL50题之1978. 上级经理已离职的公司员工【简单】
这篇SQL题目要求查找薪资低于$30000且上级经理已离职的员工ID。解决方案是:首先筛选出有经理(manager_id不为空)且薪资不足$30000的员工,然后检查这些员工的manager_id是否不在现有员工ID列表中(表示经理已离职),最后按employee_id排序输出结果。关键点在于使用NOT IN子查询判断经理是否已离职。
2025-07-28 11:54:18
390
原创 详解力扣高频SQL50题之1907. 按分类统计薪水【简单】
该题目要求统计银行账户按收入分类的数量,分为低薪(<20000)、中薪(20000-50000)和高薪(>50000)三类。通过三次单独查询并UNION合并结果,使用伪列创建分类名称,即使某类没有账户也会显示0。解题关键在于理解伪列与聚合函数的组合使用,以及确保三类结果完整输出。
2025-07-28 11:11:52
308
原创 详解力扣高频SQL50题之1204. 最后一个能进入巴士的人【简单】
题目要求找出最后一个能上巴士且不超过重量限制的乘客。通过计算乘客按顺序上车的累计重量,筛选出累计重量不超过1000kg的最后一位乘客。使用窗口函数sum() over(order by turn)计算累计重量,再筛选并排序找出符合条件的乘客。示例中John Cena是最后一个累计重量不超过1000kg的乘客。解决方案使用嵌套查询和排序来获取结果。
2025-07-28 10:01:05
953
原创 详解力扣高频SQL50题之1164. 指定日期的产品价格【中等】
题目要求查询2019-08-16所有产品的价格。初始价格为10,若产品在该日期前有价格变更,则取最近一次变更的价格。通过UNION实现:第一部分查询无变更记录的产品(返回10);第二部分通过子查询找出每个产品在2019-08-16前的最后变更日期,然后关联原表获取对应价格。Oracle实现时需注意日期格式处理。最终返回产品ID及其在指定日期的价格。
2025-07-27 23:02:19
1153
原创 详解力扣高频SQL50题之180. 连续出现的数字【困难】
本文介绍了两种SQL方法查找连续出现至少三次的数字。方法一使用row_number()计算全局行号与分组排名的差值,通过分组统计相同差值的个数来判断连续出现次数。方法二利用lead()函数比较当前行与后两行的ID差值,若差值为2则说明连续出现三次。两种方法都需对结果去重,适用于有序数字或日期序列。文章指出官方题解仅适用于连续三次的情况,并提供了更通用的解决方案。
2025-07-27 21:21:49
648
原创 详解力扣高频SQL50题之610. 判断三角形【简单】
伪SQL题,披着SQL外衣的编程题,就是凑数的,对SQL没有啥提升。关键点是任意两边之和大于第三边,没了,不想多说。
2025-07-27 17:18:10
388
原创 详解力扣高频SQL50题之1789. 员工的直属部门【简单】
文章摘要 这道LeetCode题目要求找出每位员工的直属部门。解决方案有两种主要方法:1) 使用子查询一次性筛选出直属部门为Y或部门数量为1的记录;2) 分别查询部门数量为1和直属部门为Y的记录,再用UNION合并结果。关键点在于:当员工只有一个部门时自动视为直属部门,即使标记为N;当有多个部门时需根据primary_flag='Y'确定。两种方法都通过GROUP BY处理分组,最终返回员工ID和对应的直属部门ID。
2025-07-27 15:40:55
742
原创 详解力扣高频SQL50题之1731. 每位经理的下属员工数量【简单】
这题解法和[570. 至少有5名直接下属的经理]类似,就长话短说了,自连接,将表拆分为经理表和员工表,由于返回字段有id和name,所以要对经理id和name都分组,再求count()和avg(),最后别忘记对经理id排序。
2025-07-27 12:46:34
438
原创 详解力扣高频SQL50题之1045. 买下所有产品的客户【简单】
这道题目要求找出购买了所有产品的客户ID。通过分析,我们可以将问题转化为:统计每个客户购买的不同产品数量,若等于产品表中的总产品数,则该客户符合要求。由于Customer表可能存在重复记录,需要使用DISTINCT去重。
2025-07-26 22:48:38
877
原创 详解力扣高频SQL50题之619. 只出现一次的最大数字【简单】
显然用group by+count()+max(),但是注意group by+count()得到的是在组内的数字而不是全部数字,不能直接用max(),得再嵌套一层查询再用。
2025-07-26 22:28:27
520
原创 详解力扣高频SQL50题之1084. 销售分析 III【简单】
题目要求找出仅在2019年春季(1月1日至3月31日)销售的产品。关键点:1)使用内连接关联产品和销售表;2)按产品分组后,筛选销售日期的最小值不小于2019-01-01且最大值不超过2019-03-31的记录。这样确保产品所有销售记录都落在春季范围内。解决方案通过分组和HAVING子句实现日期范围检查,输出产品ID和名称。注意要处理不同数据库的日期格式转换问题。
2025-07-26 22:01:06
1149
原创 详解力扣高频SQL50题之1141. 查询近30天活跃用户数【简单】
题目要求统计社交媒体网站在2019-07-27前30天内的每日活跃用户数。解决方案是对Activity表进行筛选,找出日期在2019-06-28至2019-07-27之间的记录,然后按日期分组并计算每天不重复的用户ID数量。使用Oracle语法实现,通过to_char格式化日期,count(distinct)统计用户数。最终返回包含日期和活跃用户数的结果表。
2025-07-26 21:12:57
903
原创 详解力扣高频SQL50题之2356. 每位教师所教授的科目种类的数量【简单】
分组就不用说了,关键是组内不重复个数,用count()嵌套distinct即可。
2025-07-26 20:44:20
368
原创 详解力扣高频SQL50题之550. 游戏玩法分析 IV【中等】
本文介绍了LeetCode SQL题目550(游戏玩法分析IV)的两种数据库实现方案。题目要求计算首次登录后第二天再次登录的玩家比例。MySQL解法通过分组获取首次登录日期,再连接原表筛选次日登录记录,最后计算比率。Oracle解法因语法限制需额外处理,即使用聚合函数处理子查询结果和使用NVL处理空表情况。两种解法都通过日期计算(MySQL用DATE_ADD,Oracle直接+1)来识别连续登录的玩家。
2025-07-26 19:11:20
834
原创 详解力扣高频SQL50题之1174. 即时食物配送 II【中等】
本文介绍了两种SQL方法计算即时订单在用户首次订单中的比例。方法一使用row_number()函数找出每个客户的首次订单,然后统计即时订单占比;方法二通过min()开窗函数确定首次订单日期。两种方法最终都通过计算即时订单数与首次订单数的比值,并四舍五入保留两位小数得到结果。第一种方法更直观,第二种方法更通用,适用于各类数据库。
2025-07-26 15:09:13
743
原创 详解力扣高频SQL50题之1193. 每月交易 I【简单】
该SQL查询统计每月各国交易数据,包括总交易数、批准交易数、总金额和批准金额。通过按月份和国家分组,使用COUNT(*)计算总交易数,SUM(CASE WHEN)统计批准交易数和金额。月份用TO_CHAR()函数格式化为'yyyy-mm'。核心技巧是运用条件聚合函数区分不同状态的数据统计。
2025-07-26 13:37:22
565
原创 详解力扣高频SQL50题之1211. 查询结果的质量和占比【简单】
这道题目要求计算查询结果的质量和劣质查询百分比。通过分析Queries表,我们需要按query_name分组,计算两个指标:quality是各查询评分与位置比率的平均值,poor_query_percentage是评分小于3的查询所占百分比。解题关键在于使用SUM和COUNT聚合函数,配合CASE WHEN处理条件统计。
2025-07-26 12:10:48
932
原创 详解力扣高频SQL50题之1633. 各赛事的用户注册率【简单】
题目要求统计各赛事的用户注册百分比,并按百分比降序和赛事ID升序排序。解决方案通过连接Users和Register表,按contest_id分组后计算每组的用户数占总用户数的百分比(保留两位小数)。关键点在于计算比例时使用子查询获取总用户数,最终结果按百分比降序和赛事ID升序排列。
2025-07-26 11:38:42
734
原创 详解力扣高频SQL50题之1251. 平均售价【中等】
这道题目要求计算每个产品的平均售价,需要关联Prices表和UnitsSold表,确保购买日期在价格有效期内。通过左连接并筛选有效日期后,使用聚合函数计算总销售额和总销量,最后处理null值并四舍五入到小数点后两位。关键点在于连接条件中处理日期范围,避免错误的记录匹配。对于没有销售记录的产品,平均售价设为0。解决方案使用了左连接、聚合函数和空值处理函数NVL,最终按产品ID分组输出结果。
2025-07-25 23:24:39
665
原创 详解力扣高频SQL50题之1934. 确认率【简单】
本文解析了LeetCode SQL题目"1934.确认率"。题目要求计算每个用户的确认率,即'confirmed'消息数除以总请求数,未请求的用户确认率为0。通过左连接Signups和Confirmations表,按用户分组后,使用CASE WHEN统计确认消息数,再除以总请求数计算确认率,最后四舍五入到小数点后两位。
2025-07-25 20:52:33
573
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人