由于项目需求,我需要把查询出来的数据进行分组,并且只需要每组前三条记录,后来了解到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;