文章目录

  • 1. 题目
    • 1.1 表
    • 1.2 需求
  • 2. 考点分析
    • 第一层解法
    • 第二次解法
    • 第三层解法
    • 更多思路
  • 3. 开撸
    • 1. 第一层解法
  • 4. 扩展:第N高的薪水
    • 4.1 说明
    • 4.2 思路
    • 4.3 窗口函数的解法
  • 作业

在如今的程序员面试过程中,考察SQL部分能力,虽不是难点,但几乎是必考.
为检查思路盲点,避免翻船,各位看官也可以复盘下,如对你有一丝的帮助,欢迎给个赞叭~
ps: 数据开发者,建议可以自己加难度进行考察

leetcode难度:中等
面试频率:中 (遇到过类似题型1次+)

1. 题目

1.1 表

Employee 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| salary      | int  |
+-------------+------+
id 是这个表的主键。
表的每一行包含员工的工资信息。

1.2 需求

编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。

查询结果如下例所示。

输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| null                |
+---------------------+

2. 考点分析

第一层解法

这道题很简单,主要考察排序+limit+偏移量的应用,很多新手可能对偏移量OFFSET 不熟,导致不好下手

第二次解法

pass

第三层解法

pass

更多思路

3. 开撸

1. 第一层解法

limit n子句表示查询结果返回前n条数据
offset n表示跳过x条语句
limit y offset x 分句表示查询结果跳过 x 条数据,读取前 y 条数据
使用limit和offset,降序排列再返回第二条记录可以得到第二大的值。

SELECTIFNULL((SELECT DISTINCT SalaryFROM EmployeeORDER BY Salary DESCLIMIT 1 OFFSET 1),NULL) AS SecondHighestSalary

PS: 注意sql的健壮性,不要忘记IFNULL 空值的判断

4. 扩展:第N高的薪水

编写一个SQL查询来报告 Employee 表中第 n 高的工资。如果没有第 n 个最高工资,查询应该报告为 null 。

输入:
Employee table:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
n = 2
输出:
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
+----+--------+
n = 2
输出:
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| null                   |
+------------------------+

4.1 说明

排名是数据库中的一个经典题目,实际上又根据排名的具体细节可分为3种场景:

连续排名,例如薪水3000、2000、2000、1000排名结果为1-2-3-4,体现同薪不同名,排名类似于编号
同薪同名但总排名不连续,例如同样的薪水分布,排名结果为1-2-2-4
同薪同名且总排名连续,同样的薪水排名结果为1-2-2-3
不同的应用场景可能需要不同的排名结果,也意味着不同的查询策略。本题的目标是实现第三种排名方式下的第N个结果,且是全局排名,不存在分组的问题,实际上还要相对简单一些。

值得一提的是:在Oracle等数据库中有窗口函数,可非常容易实现这些需求,而MySQL直到8.0版本也引入相关函数。最新OJ环境已更新至8.0版本,可直接使用窗口函数。

4.2 思路

这种题型最简单的就是用窗口函数来撸,当然如果为了挑战自己可以采用更多解法来玩下。

4.3 窗口函数的解法

实际上,在mysql8.0中有相关的内置函数,而且考虑了各种排名问题:

  • row_number(): 同薪不同名,相当于行号,例如3000、2000、2000、1000排名后为1、2、3、4
  • rank(): 同薪同名,有跳级,例如3000、2000、2000、1000排名后为1、2、2、4
  • dense_rank(): 同薪同名,无跳级,例如3000、2000、2000、1000排名后为1、2、2、3
  • ntile(): 分桶排名,即首先按桶的个数分出第一二三桶,然后各桶内从1排名,实际不是很常用

显然,本题是要用第三个函数。
另外这三个函数必须要要与其搭档over()配套使用,over()中的参数常见的有两个,分别是

  • partition by,按某字段切分
  • order by,与常规order by用法一致,也区分ASC(默认)和DESC,因为排名总得有个依据
    注:下面代码仅在mysql8.0以上版本可用,最新OJ已支持。
        SELECT DISTINCT salaryFROM (SELECT salary, dense_rank() over(ORDER BY salary DESC) AS rnkFROM employee) tmpWHERE rnk = N

作业

关于排名的问题,你还有更好的解法吗?


【SQL屠夫系列】leetcode-176. 第二高的薪水相关推荐

  1. LeetCode 176. 第二高的薪水

    题目 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 | ...

  2. LeetCode 176 第二高的薪水

    SQL架构 Employee 表: +-------------+------+ | Column Name | Type | +-------------+------+ | id | int | ...

  3. 176. 第二高的薪水(SQL中的ifnull函数和limt1,1的使用)

    176. 第二高的薪水 # Write your MySQL query statement below Select ifnull((SELECT distinct salaryfrom Emplo ...

  4. 【LeetCode】176.第二高的薪水

    176.第二高的薪水 编写一个 SQL 查询语句,获取Employee表中第二高的薪水(Salary). 用到的表和数据SQL: Create table If Not Exists Employee ...

  5. LeetCode数据库 176. 第二高的薪水

    176. 第二高的薪水 SELECT IFNULL( # 没有返回NULL(SELECT DISTINCT(Salary) FROM Employee # 选取不同的薪资ORDER BY Salary ...

  6. leecode:176. 第二高的薪水

    题目描述 Employee 表: +-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | ...

  7. leetcode中等之176.第二高的薪水

    Employee 表: Column Name Type id int salary int id 是这个表的主键. 表的每一行包含员工的工资信息. 问题 编写一个 SQL 查询,获取并返回 Empl ...

  8. 【领扣leetcode数据库】176.第二高的薪水

    题目描述 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 ...

  9. LeetCode刷题(176).第二高的薪水

    编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1  | 10 ...

最新文章

  1. redis源码之util
  2. 【安全漏洞】某CMS后台防护逻辑漏洞导致GETSHELL
  3. JZOJ 5932. 【NOIP2018模拟10.27】情报中心
  4. 代码雨代码源复制_小程序基于Parser添加长按复制、代码高亮等功能
  5. halcon write_ocr_class_svm 将OCR分类器写入文件
  6. java实用教程——常用实用类——String类(字符串类)
  7. 接口安全怎么处理_压瓦机设备噪声大怎么处理及压瓦机的安全使用
  8. Hibernate - Query简易
  9. 【转】【信息学奥赛一本通】题解目录
  10. linux配置静态ip命令,Linux设置静态IP地址
  11. 我没见过凌晨四点的洛杉矶,但想带你聆听每个都市夜归人的故事
  12. 台式计算机读不到u盘怎么回事,u盘读不出来怎么办?Win7电脑无法识别设备如何解决?...
  13. 泥瓦匠之 Java 的成长感悟
  14. 从LSM-Tree、COLA-Tree谈到StackOverflow、OSQA
  15. a pubhub service
  16. 尤里先生查看陌生人朋友圈教程_微信怎么看陌生人朋友圈 强看陌生人朋友圈教程...
  17. lightroom安卓_如何将Lightroom从PC预设导入手机(安卓amp;iOS)
  18. 马尔萨斯 ( Malthus)人口指数增长模型Logistic 模型
  19. C语言保留小数点后一位
  20. arp miss攻击_S交换机有ARP Miss告警,怎么办?

热门文章

  1. Hexo+NexT(零):最全Hexo+Next搭建博客教程
  2. 认识ETOMnbsp;(转贴)
  3. 推荐一款码云上的开源ERP(JAVA版)
  4. 从《大山的女儿》看工作和管理方式
  5. 可以在虚拟机里运行Java吗,在Java虚拟机中可以运行Java的_____文件。
  6. 我所喜欢的游戏,大家都来说说自己喜欢的:D
  7. 计算机组成原理-Verilog课程设计制作8位CPU简析
  8. 隐沫度假酒店:大趋势下当代度假生活方式的革新
  9. DevExpress论坛
  10. 人到中年,三不交三不等,说的真扎实!