有需求通过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,成功取出重复行,本以为大功告成了。后来在自己的数据库里测试了下。。。发现有几条数据还是重复的。。
刚接触数据库,很多方法都不太了解,然后又查了一下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则成功解决问题。