例如用户信息,每个人都有自己的唯一号(id),但是可能后期修改身高(h)啥的,插入新数据,造成了同一个人,同一个id号会有多条记录
现在我想要实现的是,比如有两条数据,同一个id号只取一条展示,不是删除,其他字段例如身高(h)这些字段不同没关系
我用distinct(id)根据id去重,但是两条数据身高这个字段内容不同了,查询出来不会去重,还是显示两条数据
麻烦指导下,谢谢!
SQL> select * from tt1;
ID H
---------- ----------
1 122
1 132
1 142
2 111
2 132
3 125
3 145
4 122
4 132
4 142
10 rows selected.
SQL> select id,h from tt1 a where h in (select max(h) from tt1 b where a.id=b.id);
ID H
---------- ----------
1 142
2 132
3 145
4 142
用rank() over() 或row_number() over()可以实现你的要求
例如:
select t.*
,rank() over(partition by 字段 order by 字段2 desc) rk
from table
比如字段是ID,字段2是身高
那么这个查询结果会查出该表的所有数据,然后这些数据会根据ID进行分组,分组后根据身高进行降序排序然后
每个人(ID) 都会有一个RK列,他们分别等于1~N。
然后如果只想去一条,那么外包套一层select * from 然后只需要取RK=1的数据,如果想要其他数据就不要加RK过滤
上面的结果大概如下,你可以根据RK列来筛选你要的数据
ID 身高 RK 字段1 ... 字段N
1 1.8 1 ..............
1 1.7 2 ..............
1 1.6 3 ..............
2 1.2 1 ..............
3 1.3 1 ..............
4 1.5 1 ..............
4 1.1 2 ..............
你的意思是想把身高的所有记录保存下来吗?记录一个人身高变化的过程。
那你取数据的时候就加入一个新的权重:时间。
给表加个修改时间字段,这样你只需要最新的那条不就行了。
同意love的观点,因为group by的话不能查非分组的数据感觉并不好,
如果想一直保留这个人的数据不做修改功能的话就应该只能加一个时间戳列,
select * from tb_user where userId = 用户输入的Id and updateTime = (select max(updateTime) from tb_user where userId = 用户输入Id)
GROUP BY ?
直接根据id 进行分组查询就可以了,SQL示例:
SELECT id,h FROM 表名 GROUP BY id
1.查询出重复:select * from 表名 where 重复的字段 in(select 重复的字段 from 表名 group by 重复的字段 having count(重复的字段)>1 )
2.删除ID最大的重复项:delete p1 from
ums_growth_history as p1,ums_growth_history as p2
where p1.source_id=p2.source_id and p1.id > p2.id;