SQL小菜之TOP N查找问题
前言
SQL的编写是后端面试中非常常见,其中TOP N查找问题也是高频出现的问题,今天我们来看两道SQL TOPN问题。
问题
我们有一张雇员表Employee:
CREATE TABLE `Employee` (`id` int DEFAULT NULL,`salary` int DEFAULT NULL,`department` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Question1:
查询并返回 Employee 表中第二高的 不同 薪水 。如果不存在第二高的薪水,
查询应该返回 null。查询结果如下例所示。示例1:
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+示例2:
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| null |
+---------------------+
这就是最典型一道TOP N查找问题,本题要求我们查找第二高薪水的记录,我们来将问题进行拆解:
如果要查找第二高的记录,那是不是找到第一高的记录,然后在小于该记录的结果集中,找到最大的那一个,就是我们想要的结果。
OK,思路明确,开始写SQL,先找到第一高那条记录:
select max(distinct(salary)) from Employee
因为题干中没有强调记录不重复,因此需要进行去重,接下来第二步,从比它小的结果集中找到最大的那个,就是我们想要的答案:
select max(distinct(salary)) from Employee
where salary < (select max(distinct(salary)) from Employee)
我们同时要考虑一些异常的情况,例如表中如果仅有一条记录,那么结果需要输出null:
select ifNull((max(distinct(salary))), null) as 'SecondHighestSalary' from Employee
where salary < (select max(distinct(salary)) from Employee);
针对这道题,这个SQL可以解决问题,那么题目换一下,如果不是找第二高的记录呢?如果找第三高,怎么办?
上面的SQL就不能满足我们的需求了,换一个思路,如果要找第N高的记录,我们是不是可以对结果集进行排序,然后把前面的记录丢弃,剩下的结果集取第一个,就是我们想要的结果了?诶?这不就是limit offset么?
select ifNull((select distinct(salary) from Employee order by salary desc limit 1,1), null)
as SecondHighestSalary;
使用limit offset的方式,可以解决大部分简单的TOP N问题了,那么如果修改一下题目,再加入部门的维度,希望找到每个部门中,薪水第二高的记录,上面的解法,似乎就没有办法做到了,那么是否还有其他的解决方法呢?
MySQL在8.0版本中加入了窗口函数
,专门为了解决排行问题,来看一下dense_rank()的使用语法:
DENSE_RANK() OVER ([PARTITION BY column1, column2, ...]ORDER BY column1 [ASC|DESC], column2 [ASC|DESC]
)
看起来有点乱哈,没关系,我们来看个示例来帮你理解dense_rank()。
上面的问题,如果用dense_rank()解决:
select (select distinct salary from (select dense_rank() over ( order by salary desc) as rn, u.* from Employee u) t where t.rn = 2) as SecondHighestSalary;
单看上面的SQL你可能还是会一脸懵逼,没关系,让我们来拆解一下SQL,先看最中间的核心子查询:
select dense_rank() over ( order by salary desc) as rn, u.* from Employee u;+----+------+--------+------------+
| rn | id | salary | department |
+----+------+--------+------------+
| 1 | 4 | 400 | 二部 |
| 2 | 3 | 300 | 二部 |
| 3 | 2 | 200 | 一部 |
| 3 | 2 | 200 | 一部 |
| 4 | 1 | 100 | 一部 |
+----+------+--------+------------+
可以发现dense_rank()对结果集进行了排序处理,并输出了根据目标字段排序的记录的排名序号,那么再回头看上面的SQL就非常好理解了,我们需要找到排名第二的记录,通过where限定,即可达到预期结果。
再回到上上个问题,如果我们希望查找每个部门中,薪水第二高的记录,怎么做?
聪明的你肯定想到,对部门字段进行group by,再找到第二高的记录,幸运的是,dense_rank()提供了根据字段进行分组的功能,就是PARTITION BY
参数,那么来看一下SQL该怎么写:
SELECT t.department, t.salary FROM (SELECT salary,department,DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rnFROM Employee
) t
WHERE rn = 2;
DENSE_RANK()、ROW_NUMBER() 和 RANK()对比
最后,我们来看一下MySQL中关于处理排名相关的几个函数,DENSE_RANK、ROW_NUMBER 和 RANK 是 SQL 中三种不同的窗口排名函数,它们的主要区别在于处理相同值(并列)的方式:
- ROW_NUMBER()
- 为每一行分配唯一的序号,从 1 开始递增
- 对于相同的值,按照它们在结果集中出现的顺序分配不同的序号
- 结果总是连续的数字,不会出现间隔
- RANK()
- 为每一行分配排名,从 1 开始
- 对于相同的值,分配相同的排名
- 排名可能会有间隔,因为相同值后的下一个排名会跳过已用的编号
- 例如:1, 2, 2, 4, 5…(注意跳过了 3)
- DENSE_RANK()
- 为每一行分配"密集排名",从 1 开始
- 对于相同的值,分配相同的排名
- 排名始终是连续的,不会有间隔
- 例如:1, 2, 2, 3, 4…(无跳过)
结语
本篇,我们简单的探讨了SQL问题中非常经典的TOP N查找问题,学习了关于该种问题的几种解法,希望对你有所帮助。
相关文章:
SQL小菜之TOP N查找问题
前言 SQL的编写是后端面试中非常常见,其中TOP N查找问题也是高频出现的问题,今天我们来看两道SQL TOPN问题。 问题 我们有一张雇员表Employee: CREATE TABLE Employee (id int DEFAULT NULL,salary int DEFAULT NULL,department varchar(…...
蓝桥杯 临时抱佛脚 之 二分答案法与相关题目
二分答案法(利用二分法查找区间的左右端点) (1)估计 最终答案可能得范围 是什么 (2)分析 问题的答案 和 给定条件 之间的单调性,大部分时候只需要用到 自然智慧 (3)建…...
Css环形旋转立体感动画
Css环形旋转立体感动画 index.html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>Css环形旋转立体感动画</title><link rel"stylesheet" href"./style.css">&l…...
音乐极客指南:Melody高音质私有云音乐平台本地部署方案
文章目录 前言1. 添加镜像源2. 本地部署Melody3. 本地访问与使用演示4. 安装内网穿透5. 配置Melody公网地址6. 配置固定公网地址 前言 嘿,各位音乐爱好者们!今天我要带大家玩个大招——在香橙派Zero3上搭建你的专属在线音乐平台,还能通过cpo…...
Microi吾码界面设计引擎之基础组件用法大全【内置组件篇·中】
🎀🎀🎀 microi-pageengine 界面引擎系列 🎀🎀🎀 一、Microi吾码:一款高效、灵活的低代码开发开源框架【低代码框架】 二、Vue3项目快速集成界面引擎 三、Vue3 界面设计插件 microi-pageengine …...
# WebSocket 与 Socket.IO 对比与优化
核心概念对比 WebSocket 协议性质:HTML5 提供的全双工通信协议 (RFC 6455)连接方式:基于 TCP 的低层协议通信模式:持久化连接,服务端可主动推送协议升级:通过 HTTP 101 状态码切换协议 Socket.IO 协议性质…...
vue3中,route4,获取当前页面路由的问题
首先应用场景如下: 在main.js里面,引入的是路由的配置文件,如下: import {router} from /router; app.use(router); 路由配置文件router.js如下: import { createRouter, createWebHistory } from vue-router; imp…...
python将整个txt文件写入excel的一个单元格?
要将整个txt文件写入Excel的一个单元格,可以使用Python的openpyxl库来实现。以下是一个简单的示例代码: from openpyxl import Workbook# 读取txt文件内容 with open(file.txt, r) as file:txt_content file.read()# 创建一个新的Excel工作簿 wb Work…...
日志2333
Pss-9 这一关考察的是时间盲注 先练习几个常见命令语句: select sleep(5);--延迟5s输出结果 if (1>0,ture,false);--输出‘ture’ /if (1<0,ture,false);--输出‘false’ select ascii()/select ord()返回字…...
用Deepseek写扫雷uniapp小游戏
扫雷作为Windows系统自带的经典小游戏,承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏,包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者,都能从本文中获得启发。 …...
C++中的异常和智能指针
一、C中的异常 1.1C语言中关于错误的处理(回顾) 1.1.1处理一:文件中的错误码,错误信息 C语言中,文件打开成功则返回地址,不成功返回0 FILE* foutfopen("Test.txt","r"); cout<&…...
Selenium 简单入门操作示例
最简单的 Selenium 示例(Python版) 下面是一个完整的、最简单的 Selenium 操作示例,带你快速上手: from selenium import webdriver from selenium.webdriver.common.by import By import time# 1. 启动浏览器(这里使…...
6.1 模拟专题:LeetCode 1576. 替换所有的问号
1. 题目链接 LeetCode 1576. 替换所有的问号 2. 题目描述 给定一个仅包含小写字母和问号 ? 的字符串 s,要求将所有 ? 替换为任意小写字母,使得替换后的字符串中 没有相邻的两个字符相同。 示例: 输入:s "?zs" →…...
前端知识点---用正则表达式判断邮箱(javascript)
// 全面的正则(兼容大多数情况) const emailRegex /^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$/;// 或直接使用浏览器内置验证 <input type"email" required>/:正则表达式的起始和结束标志。 ^:匹配字符串的…...
深度剖析 Spring 源码 性能优化:核心原理与最佳实践
深度剖析 Spring 源码 & 性能优化:核心原理与最佳实践 🚀 Spring 框架 作为 Java 生态的核心技术,广泛应用于企业级开发。但很多开发者只会“用”Spring,而不深入其内部原理,导致无法高效排查问题 & 进行性能优…...
Axure RP9教程 :轮播图(动态面板) | 头部锁定
文章目录 引言I 轮播图操作步骤在画布中添加一个动态面板设置面板状态II 头部锁定将头部区域选中,右键组合或用Ctrl+G快捷键;将组合的头部区域,右键创建动态面板;引言 动态面板的功能十分强大,比如:拥有独立的内部坐标系,有多个状态; Banner的案例中会用到动态面板多个…...
rabbitmq承接MES客户端服务器
文章目录 背景整体架构概述方案详细步骤1. 数据库选型与搭建2. 设备端数据上传至数据库3. 搭建 RabbitMQ 服务器4. 数据同步模块(数据库到 RabbitMQ)5. MES 服务器从 RabbitMQ 接收数据6. 指令接收模块(RabbitMQ 到设备端) 7. MES…...
重学vue3(三):vue3基本语法及使用
组合式 API是vue3 的核心特性,替代 Vue2 的选项式 API,强调逻辑复用和代码组织。基本语法如下: <script setup> import { ref, reactive, computed, onMounted } from vue;// 1. 响应式数据 const count ref(0); // 基本类…...
算法 | 麻雀搜索算法原理,公式,改进算法综述,应用场景及matlab完整代码
一、麻雀搜索算法(SSA)原理 1. 算法基础 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一种群体智能优化算法,灵感来源于麻雀群体的觅食与反捕食行为。算法将麻雀分为三类角色:发现者(Producer):适应度最高,负责探索全局最优区域;加入者(Follower)…...
0322-数据库与前后端的连接、数据库表的增删改查
前端 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here</title> <script srcjs/jquery-3.7.1.min.js></script> <script> //jquaryajax发起请求 //传参形式不同 post用data{}…...
详细介绍Qt中用于断言的宏 Q_ASSERT
Q_ASSERT 是 Qt 框架中用于调试的核心宏之一,其作用类似于标准 C/C 的 assert,但针对 Qt 的特性进行了优化。它用于在开发阶段验证程序的逻辑正确性,帮助开发者快速定位潜在的错误。 1.基本用法 Q_ASSERT(condition);功能:在调试…...
基于Python的自然语言处理系列(60):使用 LangChain 构建 Multi-Vector Retriever 进行文档检索
在 NLP 和 AI 领域,基于嵌入(Embeddings)进行文档检索已成为一种高效的解决方案。本文介绍如何使用 LangChain 构建 Multi-Vector Retriever,实现对长文档的分块索引和高效检索。 1. 环境准备 首先,我们需要安装相关…...
Dify 部署指南-离线版
Docker 部署 1、 访问 Docker 官网 (https://www.docker.com/) 获取安装包。 2、 上传 Docker 安装包 3、 进入解压目录,执行解压命令 tar xzvf docker-28、0.2、tgz4、 将解压文件中的 Docker 相关文件移动到 /usr/bin/ 目录 sudo cp docker/* /usr/bin/5、 创建…...
解决 Element UI 嵌套弹窗的状态管理问题!!!
解决 Element UI 嵌套弹窗的状态管理问题 🔧 问题描述 ❓ 在使用 Element UI 开发一个多层嵌套弹窗功能时,遇到了以下问题: 弹窗只能打开一次,第二次点击无法打开 🚫收到 Vue 警告:避免直接修改 prop 值…...
基于STM32单片机的智能手环/音乐播放/语音识别
基于STM32单片机的智能手环/音乐播放/语音识别 持续更新,欢迎关注!!! ** 基于STM32单片机的智能手环/音乐播放/语音识别 ** 21世纪,社会高速发展,生活物质越来越丰富,随着科技的进步,智能化成为了人们关注的焦点&am…...
NFC 智能门锁全栈解决方案:移动端、服务器、Web 管理平台
目录 一、系统整体架构 二、移动端 APP 开发 2.1 开发环境与基础准备 2.2 主要功能模块 2.3 示例代码(Android/Kotlin 简化示例) 三、后台服务开发 3.1 环境准备 3.2 主要功能 3.3 示例代码(Node.js Express 简化示例) …...
使用 Python 开发 MCP Server 及 Inspector 工具详解
使用 Python 开发 MCP Server 及 Inspector 工具详解 前言 模型上下文协议 (Model Context Protocol, MCP) 是一种新兴的协议,旨在让大型语言模型 (LLM) 更容易地与外部工具和服务集成。本文将介绍如何使用 Python 开发一个 MCP Server,并详细讲解如何使…...
论坛系统测试报告
一、项目背景 为论坛系统项目设计并进行自动化测试。论坛系统由六个页面构成:用户登录页、用户注册页、个人中心页面、我的帖子页面、帖子编辑页、帖子列表页以及帖子详情页。 通过使用selenium工具来定位到web中的元素,对获取到的元素进行自动化测试等操…...
Android一个APP里面最少有几个线程
Android应用启动时,默认会创建一个进程,该进程中最少包含5个系统自动创建的线程,具体如下: Main线程(主线程/UI线程) 负责处理用户交互、UI更新等核心操作,所有与界面相关的逻辑必须在此线程执行。若在此线程执行耗时操作(如网络请求),会导致界面卡顿甚至触发ANR(应…...
DML 数据操纵语言学习笔记
一、DML 核心概念体系 1.1 语言定位与边界 DML(Data Manipulation Language)作为 SQL 三大核心语言之一,专注于数据行级操作,区别于 DDL(结构定义)和 DCL(权限控制)。其核心指令包…...
7-Zip 功能介绍
7-Zip 是一款开源、高效的文件压缩与解压缩工具,支持多种格式,以高压缩率和灵活性著称。以下是其核心功能: 多格式支持 压缩 / 解压:支持 7z(默认格式,压缩率极高)、ZIP、RAR、GZIP、BZIP2、TAR…...
《基于python游戏设计与实现》开题报告
个人主页:@大数据蟒行探索者 一、研究背景、目的及意义 (一)研究背景 游戏的普及与成功:随着智能手机的普及和网络技术的发展,手机游戏产业逐渐成熟,成为娱乐文化产业的重要组成部分。《开心消消乐》作为一款休闲类游戏,自上线以来凭借其简单易上手的玩法和丰富的…...
鸿蒙学习笔记(3)-像素单位、this指向问题、RelativeContainer布局、@Style装饰器和@Extend装饰器
一、像素单位 物理像素:用px表示。 逻辑像素:在布局的时候,底层针对物理像素和屏幕尺寸关系进行转化的中间层。 分辨率:代表在屏幕上到底布局了多少了像素点(发光点) 官方同时也提供了相关单位,在开发中…...
Selenium之简介
Selenium简介 首先,让我们看看官网是怎么定义的 Selenium是一个支持web浏览器自动化的一系列工具和库的综合项目,提供了扩展来模拟用户和浏览器的交互,用于扩展浏览器分配的分发服务器;用于W3C WebDriver规范的基础架构 其实&a…...
使用Ollama(自定义安装位置)与RagFlow构建本地知识库
目录 1. 为什么不直接使用网页版DeepSeek?2. 如何实现网页版DeepSeek不能实现的需求?3. 目标效果预览4. 为什么要使用RAG技术?RAG和模型微调的区别?5. 什么是Embedding?为什么需要“Embedding模型”?6. 本地部署全流程6.1 下载ollama,通过olama将DeepSeek模型…...
基于ssm的医院预约挂号系统
一、系统架构 前端:jsp | bootstrap | jquery | css | ajax 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat 二、代码及数据 三、功能介绍 01. 注册 02. 登录 03. 首页 04. 医院挂号 05. …...
如何通过less在vue2中达到切换皮肤的目的
先装less npm install less less-loader --save-dev 然后将该 loader 添加到 webpack 的配置中去,例如: webpack.config.js module.exports {module: {rules: [{test: /\.less$/i,use: [// compiles Less to CSSstyle-loader,css-loader,less-loade…...
DeepSeek概述
一、DeepSeek概述 1.1 DeepSeek是什么 DeepSeek是一家专注 通用人工智能(AGI,Artificial General Intelligence)的中国科技公司,主攻大数据研发与应用。DeepSeek-R1是其开源的推理模型,擅长处理复杂任务且可免费商用…...
生成模型速通(Diffusion,VAE,GAN)
基本概念 参考视频https://www.bilibili.com/video/BV1re4y1m7gb/?spm_id_from333.337.search-card.all.click&vd_sourcef04f16dd6fd058b8328c67a3e064abd5 生成模型其实是主要是依赖概率分布,对输入特征的概率密度函数建模 隐空间(latent space)…...
linux/android 如何获取当前系统启动时长
uptime 指令获取 trinket:/ # uptime12:03:31 up 3 min, 0 users, load average: 1.02, 0.68, 0.29...
Elasticsearch客户端工具初探--kibana
1 Kibana简介 Kibana是Elastic Stack(ELK)中的可视化工具,用于对Elasticsearch中存储的数据进行搜索、分析和可视化展示。它提供了直观的Web界面,支持日志分析、业务监控、数据探索等功能,广泛应用于运维监控、安全分析…...
深克隆和浅克隆(建造者模式,内含简版)
让我们来看一个例子: 设计一个客户类Customer,其中客户地址存储在地址类Address中,用浅克隆和深克隆分别实现Customer对象的复制并比较这两种克隆方式的异同。 代码实现 Customer类和Address类都是实现的Java 内置的 java.lang.Cloneable …...
吴恩达机器学习笔记复盘(十二)逻辑回归的梯度下降和拟合问题
梯度下降算法推导过程 一、逻辑回归模型基础 逻辑回归用于二分类问题,其假设函数为sigmoid函数: 其中,是模型参数向量,是特征向量。输出表示样本属于正类的概率。 二、损失函数 逻辑回归的损失函数采用 对数损失(交…...
OSPF五种报文分析(仅部分比较重要的)
OSPF五种报文分别是: hello报文,DBD数据库描述报文,LSR链路状态请求报文,LSU链路状态更新报文,LSACK链路状态确认包 以下是这五种报文的详细解读: 1. Hello报文 作用: 用于邻居的发现、建立和…...
Ubuntu 22.04 二进制安装单节点 MySQL
Ubuntu 22.04 二进制安装 MySQL LTS(长期支持版)完整教程 MySQL LTS 版本选择: 目前 MySQL 8.4.4 是长期支持(LTS)版本,持续更新并保持稳定。 下载版本: 你也可以在 MySQL 官方网站确认最新稳…...
python处理音频相关的库
1 音频信号采集与播放 pyaudio import sys import pyaudio import wave import timeCHUNK 1024 FORMAT pyaudio.paInt16 CHANNELS 1#仅支持单声道 RATE 16000 RECORD_SECONDS 3#更改录音时长#录音函数,生成wav文件 def record(file_name):try:os.close(file_…...
python+ffmpeg给音频添加背景音乐
说明: 我希望用python,将name.mp3这段录音文件,添加背景音乐,bg.mp3,然后生成新的文件 step1: 添加依赖 pip install pydubstep2:下载ffmpeg 1.打开windows powershell ,管理员运行 2.winget install ff…...
《TypeScript 面试八股:高频考点与核心知识点详解》
“你好啊!能把那天没唱的歌再唱给我听吗? ” 前言 因为主包还是主要学习js,ts浅浅的学习了一下,在简历中我也只会写了解,所以我写一些比较基础的八股,如果是想要更深入的八股的话还是建议找别人的。 Ts基…...
鸡生蛋还是蛋生鸡? 基于python的CCM因果关系计算
文章目录 前言一、安装二、代码1.全部代码2.结果展示总结前言 因果推断在科学研究中起着重要的作用,尤其是在复杂系统中,例如生态学、气候学、经济学等领域。在这些领域中,了解变量之间的因果关系可以帮助我们更好地理解系统的动态行为和相互作用。传统的相关性分析并不足以…...
PyBluez2 的详细介绍、安装指南、使用方法及配置说明
PyBluez2:Python 蓝牙开发的核心库 一、PyBluez2 简介 PyBluez2 是 Python 的开源蓝牙编程库,支持蓝牙 2.0、BLE(低功耗蓝牙)和传统蓝牙协议栈的开发。它提供了对蓝牙硬件适配器的底层控制,适用于设备发现、配对、数…...