Mysql获取每组前N条记录(开窗函数)

由于项目需求,我需要把查询出来的数据进行分组,并且只需要每组前三条记录,后来了解到MySQL实现开窗函数的方法,用了之后发现是可以,但今天发现这个方法在Navicat Premium软件中运行第一次所查询出来的数据不符合,运行第二次才是符合要求,具体原因有空再了解。后来发现以下方法可以实现我的需求,万分感谢,很6

以上原因进行说明
我的另一篇博客使用开窗函数实现:https://blog.csdn.net/smile_life_/article/details/81216926
Mysql获取每组前N条记录的效果,是因为在sql语句中使用到了自定义变量。
而在Navicat Premium中第一次连接数据库时并运行sql语句,这时的变量处于声明状态,所以没有起到效果。没有断开连接去运行第二次时候,因为变量声明好了,所以就有效果了。

以下链接是不需要使用自定义变量的方式:
转:https://blog.csdn.net/wzy_1988/article/details/52871636#commentBox

从下面sql 可以理解出实现的思路:意思就是先把Employee 表查出来,然后逐行拿数据到where子句中查,看看比当前行的工资多的人数是不是超过3个人,如果有超过,则证明当前行的工资(Salary)不是最多的,如果小于3个,则说明当前行的工资是整个部门中工资最多的3个人之一

SELECT
	d. NAME AS Department,
	e. NAME AS Employee,
	e.Salary AS Salary
FROM
	Employee AS e
INNER JOIN Department AS d ON e.DepartmentId = d.Id
WHERE
	(
		SELECT
			count(DISTINCT(e1.Salary))
		FROM
			Employee AS e1
		WHERE
			e1.DepartmentId = e.DepartmentId
		AND e1.Salary > e.Salary
	) < 3
ORDER BY
	e.Salary DESC;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值