使用Mysql实现Postgresql中窗口函数row_number的功能

news/2024/7/9 20:58:39 标签: mysql, postgresql, 数据库

1. 描述

需要根据用户id,查询每个人得分第二高的科目信息

2. 表结构及数据

2.1 表结构

CREATE TABLE `t_score` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `score` double NOT NULL,
  `subject` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4;

2.2 测试数据

INSERT INTO hz_base.t_score
(id, user_id, score, subject)
VALUES(5, 1, 110.0, '数学');
INSERT INTO hz_base.t_score
(id, user_id, score, subject)
VALUES(6, 1, 116.5, '语文');
INSERT INTO hz_base.t_score
(id, user_id, score, subject)
VALUES(7, 1, 72.0, '英语');
INSERT INTO hz_base.t_score
(id, user_id, score, subject)
VALUES(8, 2, 116.5, '语文');
INSERT INTO hz_base.t_score
(id, user_id, score, subject)
VALUES(9, 2, 92.0, '英语');
INSERT INTO hz_base.t_score
(id, user_id, score, subject)
VALUES(10, 2, 88.0, '数学');

3. 使用

3.1 类似问题postgresql使用窗口函数ROW_NUMBER实现示例

select * from (
select id, user_id, score, subject,ROW_NUMBER() over (PARTITION by user_id order by score desc) rn from t_score 
) a
where rn = 2

3.2 mysql实现

由于mysql中8.0以下版本缺少对应的窗口函数,如果需要实现该逻辑,可以使用以下sql实现

-- 使用子查询,根据用户id分析,取第二个
select id, user_id, score, subject from t_score s1
where s1.id = (
	select id from t_score
	where user_id = s1.user_id 
	order by score desc
	limit 1 offset 1
);

4. 运行结果

4.1 全部数据

4.2 筛选出的数据


http://www.niftyadmin.cn/n/5357209.html

相关文章

【Tomcat与网络2】一文理解Servlet是怎么工作的

在前面,我们研究了如何用idea来启动一个Servlet程序,今天我们就再来看一下Servlet是如何工作的。 目录 1.Servlet 介绍 2.Servlet 容器工作过程 3.Servlet的扩展 不管是电脑还是手机浏览器,发给服务端的就是一个 HTTP 格式的请求&#xf…

IS-IS:03 ISIS链路状态数据库

一个 OSPF 链路状态数据库是若干条 LSA 的集合。与此相似,一个 IS-IS 链路状态数据库是若干条 LSP 的集合。与 OSPF 链路状态数据库不同, IS-IS 链路状态数据库有 level-1 和 level-2 之分。 在IS-IS 协议中,每一条 LSP 都有一个剩余生存时间…

linux_ftp客户端如何带有密码下载文件

目录 简介linux 使用密码登录ftplinux 客户端指定密码下来文件下载成功截图 简介 当我们使用linux 的ftp 客户端想从服务端下载一个文件的时候 又不会指定密码 应该如何处理呢 linux 使用密码登录ftp # 语法 lftp -u {ftp账号},{ftp密码} ftp://{服务器IP}:{端口}# 实例使用…

C语言每日一题(49)二叉树的三种基本遍历方法

题目链接 前序遍历 中序遍历 后序遍历 知识点:链式二叉树、递归 思路分析 顺便说一下三种遍历的方法 前序遍历:根、左子树、右子树 中序遍历:左子树、根、右子树 后序遍历:左子树、右子树、根 以这棵树为例 以前序遍历为…

C#: form 添加窗体最小化事件,添加系统托盘图标,点击后可以打开、最小软件窗口

说明: 1.实现窗体在最小化后触发一个事件,可以去实现需要的功能。 2.最小化后软件图标出现在系统右下角的托盘串口。 3.点击托盘口的图标可以实现软件弹出窗口和最小化的切换。 1.参考办法 以下是判断C#窗体最小化到状态栏的状态的方法:…

力扣0086——分隔链表

分隔链表 难度:中等 题目描述 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例1 origin_url%2Fimages…

Linux:进程信号的概念与产生原理

文章目录 信号的概念实践信号关于前台和后台进程的操作 操作系统与外设信号的产生signal系统调用 前面的篇章结束了信号量的话题,那么接下来引入的是信号的话题,信号和信号量之间没有任何关系,只是名字比较像 信号的概念 在生活中存在各种各…

大数据 - Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进

目录 1.1 🐶Hadoop回顾 1.2 🐶spark简介 1.3 🐶Spark特性 1. 🥙通用性 2. 🥙简洁灵活 3. 🥙多语言 1.4 🐶Spark Core编程体验 1.4.1 spark开发工程搭建 1. 🥙开发语言选择&…