1.利用开窗函数可以实现字段分组去重,其中要注意几点:
- 需要外套查询语句,不然无法识别ROWNUM ,也就是 row_number
- 注意 分组排序方式(也可以说是分组维度, 根据某一字段去重其实就相当于根据某一字段分组),比如这里排序是 s_id 降序排列,以s_code 进行分组,如果有两行数据的 s_code 相同,那么rownum =1 的时候就 是只取第一组,即 s_id最大的那一行
select temp.* from( select row_number() over(partition by S_CODE order by s_id desc) as row_number,s_id,s_code,s_name,AMOUNT from TEST ) temp where temp.row_number = 1 order by s_id;
2. 测试用例:
查询SQL见上,查询结果如下:
可以见到,所有重复行都根据s_id取了最大的那一行,如果rownum = 2 就会递减,展示重复行用s_id 降序排列 后 剩下 的一批次,如图:
3. 总结
目前来说Oracle 用group by 可以分组,但是无法实现查询其余字段又单一字段去重(除非你的其余字段均为聚合函数,sum(xx)这种) ,使用 或者 结合 rownum() over (partition by ....) 实现分组居多。
标签:partition,number,字段,分组,Oracle,id,row From: https://www.cnblogs.com/dabuliu/p/16602531.html