ORACLE 查询去重保留第一条排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE 查询去重保留第一条排序相关的知识,希望对你有一定的参考价值。

原结果集例:

根据时间排序 希望显示的结果集是 时间倒序第一条数据, 按A_ID去重。 显示最新一条数据在最前面。

希望达到效果:

按A_ID分类,时间最新的一条数据排在最前面,其他的排在后面。 效果类似于 以上两张图拼接起来的结果集。
求各位大神帮帮忙 , 纠结了一个上午了, 在线等。。。

用分析函数row_number() over (partition by ... order by ...)给记录按组编号,然后只取编号值为1的记录,应该就是你要的结果集了。

select s.*
from (
  select d.A_ID, d.A_DATE, d.A_NAME, row_number() over (partition by d.A_ID order by d.A_DATE desc) as rowidx
  from your_table d  
) s
where s.rowidx = 1

row_number这样的分析函数,基本上现在主流的数据库都有支持(版本太旧的话是没有此功能的)。

参考技术A select *
from (SELECT 表.*,rank() OVER(PARTITION BY A_ID ORDER BY A_DATE DESC) CT
FROM 表)temp
order by temp.ct,temp.A_DATE desc

是不是就可以了?试一下,没有实际的表。本回答被提问者采纳
参考技术B 我试着写两个,不一定可以,因为我没有测试。不过理论上来说应该可以。
(1)利用union all不排序的特点(这样一般来说上面的语句在前面,后面的语句在后面,不过效率应该就完蛋了)
select * from table where a_date in(select max(a_date) from table group by a_id)
union all
select * from table where a_date not in(select max(a_date) from table group by a_id)
(2)利用分组排序,然后在排序的办法(这样后面的顺序肯定是乱的,不知道这样行不行。)
select a_id,a_date,a_name from
(select a_id,a_date,a_name,row_number()over(partition by a_id order by a_date desc) num from table) order by num

转转转--oracle 去重并按时间排序取第一条

select  t.*  
   from (select a.*, row_number() over(partition by 需要分组的字段 order by 更新时间 desc) rw  
           from 表 a) t  
  where t.rw = 1  

row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 

与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码。 

row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开始排序)。 

rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) 

dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。 

oracle 分析函数 row_number(),返回一个整数值(>=1);



以上是关于ORACLE 查询去重保留第一条排序的主要内容,如果未能解决你的问题,请参考以下文章

hive如何去掉重复数据,显示第一条

oracle 查询数据只要排序后的第一条记录(不用rownum=1),sql语句怎么写

oracle 查询数据只要排序后的第一条记录(不用rownum=1),sql语句怎么写

如何能实现将oracle的查询结果排序后,只返回第一条记录

sql语句查询如何显示第一条数据

oracle获取排序第一的数据