SQL中的distinct关键词
至少SQL Server,HQL,Oracle都有效
通常SQL中对表中数据去重,会首先想到 distinct
关键字,
能实现的需求
1. distinct可以对单个字段去重
select distinct name from A
2. 对多个字段去重时,此时所列的字段需要同时满足才会起到去重效果,否则不会去重
select distinct name, id from A --name和id同时重复才能去重,有一个不一样都不会去重
--上面的写法是对name和id列都去重,而不是仅对name去重,id不去重
select distinct * from A --*所代表的所有字段都重复时,才能去重
不能实现的需求
3. 不能实现指定字段去重,其他字段不去重的效果
select name, distinct id from A --仅希望对id列进行去重,name列不去重,xxx这样是不行的,无法实现 ,而且会提示错误,因为distinct必须放在开头
问题:
如果想实现针对某一字段去重,其他字段是否重复不关心的效果怎么处理?
答:
可以采用row_number()的窗口函数
转换问题,可以转换为对重复的行取top1,这样使用over()函数,对指定列分组,排序,然后结合row_number()给每一组的数据一列序列,再对集合取序列为1的行
结合一些用例更容易懂一些。