select b.rowid,b.* from bonus b where b.rowid =(select max(rowid) from bonus a where a.ename=b.ename);
这个地方没有进行分组 按道理讲应该查询的是最大的那一个rowid
但是实际上他按照name分组了 查询了 多个重复的结果
------解决方案--------------------
where a.ename=b.ename这个条件导致了按照name分组。
每次都会和外层b表的ename进行连接,其实就相当于求出了每个ename中最大的rowid
------解决方案--------------------
select *
from (select ROW_NUMBER() OVER(ORDER BYb.rowid DESC) RANK_NUM,
b.rowid,
b.* from bonus b where b.rowid)
where rank_num = 1
这样写应该就是你要的效果了
------解决方案--------------------
我试着给你逐一解答下
select b.rowid,b.* from bonus b where b.rowid =(select max(rowid) from bonus a where a.ename=b.ename);
--1、select max(rowid) from bonus a where a.ename=b.ename
-- 这句是根据b.ename求到这个ename的最大的物理存储地址,即根据ename找到重复值中的最大的一个地址值。
--2、select b.rowid,b.* from bonus b where b.rowid =(select max(rowid) from bonus a where a.ename=b.ename);
--所以外层sql意思是根据嵌套sql里面的物理地址查询,直接查询的是bonus表中根据name分组后的最大值,即去重其他值。