oracle先分组再去重复,初学oracle——oracle查询时通过分组去除重复行

有需求通过oracle进行数据查询显示,名字相同的只显示一条。

下面是创建的测试数据:

表:

create table t_test(

pk_id         VARCHAR2(50 BYTE)               not null,

g_name        VARCHAR2(200 BYTE),

f_description VARCHAR2(400 BYTE),

f_order        NUMBER,

constraint pk_t_test primary key (pk_id)

)

数据:insert into t_test values('a1','张三','',1);

insert into t_test values('a2','张三','',2);

insert into t_test values('a3','李四','',3);

insert into t_test values('a4','李四','',4);

第一时间想通过distinct来筛选,于是进行如下测试      select distinct g_name from t_test,可以得到两条记录。。但只能显示f_name,我想取到pk_id就不行了。

错误写法:select pk_id,distinct g_name from t_test  “表达式不存在”

select distinct g_name,pk_id from t_test “按照gname和pk_id来筛选,相当于没有筛选”

通过查阅网上资料,发现可以通过分组后取每组的第一条来进行筛选,代码如下:select * from (select pk_id,g_name,f_description,f_order,rank() over(partition by g_name order by f_order) rank from t_test) t where t.rank=1,成功取出重复行,本以为大功告成了。后来在自己的数据库里测试了下。。。发现有几条数据还是重复的。。

0818b9ca8b590ca3270a3433284dd417.png

刚接触数据库,很多方法都不太了解,然后又查了一下rank_over 方法,原来rank() over对有相同的值,标记相同的值。row_number() 则不会。后面改成select * from (select pk_id,g_name,f_description,f_order,row_number()  over(partition by g_name order by f_order) rank from t_test) t where t.rank=1则成功解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值