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 查询去重保留第一条排序的主要内容,如果未能解决你的问题,请参考以下文章
oracle 查询数据只要排序后的第一条记录(不用rownum=1),sql语句怎么写