Oracle过滤重复数据,取最新的数据

9人阅读 评论(0) 收藏 举报
分类:

问题:在项目中有一张设备检测信息表DEVICE_INFO_TBL, 每个设备每天都会产生一条检测信息,现在需要从该表中检索出每个设备的最新检测信息。也就是device_id字段不能重复,消除device_id字段重复的记录,而且device_id对应的检测信息test_result是最新的。

解决思路:用Oracle的row_number() over函数来解决该问题。
解决过程:
1.查看表中的重复记录

select
    t.id,
    t.device_id,
    t.update_dtm,
    t.test_result
from DEVICE_INFO_TBL t

这里写图片描述
2.标记重复的记录

select
    t.id,
    t.device_id,
    t.update_dtm,
    t.test_result,
    row_number() OVER(PARTITION BY device_id ORDER BY t.update_dtm desc) as row_flg   
from DEVICE_INFO_TBL t

这里写图片描述
3.过滤重复数据,取得最新的记录

select
    temp.id,
    temp.device_id,
    temp.update_dtm,
    temp.test_result
from (
         select
             t.id,
             t.device_id,
             t.update_dtm,
             t.test_result,
             row_number() OVER(PARTITION BY device_id ORDER BY t.update_dtm desc) as row_flg   
          from DEVICE_INFO_TBL t ) temp
where temp.row_flg  = '1'

这里写图片描述
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .
lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。

查看评论

Oracle去除重复(某一列的值重复),取最新(日期字段最新)的一条数据

转自 : http://blog.csdn.net/nux_123/article/details/45037719 问题:在项目中有一张设备检测信息表DEVICE_INFO_TBL...
  • w405722907
  • w405722907
  • 2017-11-17 15:34:27
  • 1935

使用Oracle的row_number() over函数过滤重复数据,取最新的记录

问题:在项目中有一张设备检测信息表DEVICE_INFO_TBL, 每个设备每天都会产生一条检测信息,现在需要从该表中检索出每个设备的最新检测信息。也就是device_id字段不能重复,消除devic...
  • lu7kang
  • lu7kang
  • 2010-08-27 00:11:00
  • 3439

oracle去除重复, 取最新的第一条数据

问题:在项目中有一张设备检测信息表DEVICE_INFO_TBL, 每个设备每天都会产生一条检测信息,现在需要从该表中检索出每个设备的最新检测信息。也就是device_id字段不能重复,消除devic...
  • nux_123
  • nux_123
  • 2015-04-14 09:40:28
  • 7163

解决sql 过滤重复数据记录的方法(Oracle)

分别创建了两个临时表,并按不同的字段作查询示例: create table table1 (id int, ip varchar(15), city char(20)); insert ...
  • luqin1988
  • luqin1988
  • 2012-09-03 09:25:07
  • 6028

ORACLE语句多条重复记录中只取一条时间最近的记录

多条重复记录中只取一条时间最近的记录 select aa.forecast_no, t1.wgt jz, t1.sj zl_sj, t2.wgt mz, t3.wgt pz      from Tab...
  • missile13
  • missile13
  • 2016-06-15 14:04:54
  • 3140

Oracle查询一批数据,某字段的内容有重复数据,怎样取相同的记录中时间最近的一条

select * from jd_t_sb_wxtz$dc$jxjl a, (select max(vc_date) maxtime,vc_pid from jd_t_sb_wxtz$dc$jxjl ...
  • zhu_nana
  • zhu_nana
  • 2016-04-18 11:24:24
  • 3234

Oracle相同ID有多条记录,取时间最近的一条

select * from (select t.*, row_number() over(partition by t.strcasei...
  • ao123056
  • ao123056
  • 2016-11-28 11:03:02
  • 3888

Oracle 中按条件过滤重复记录

在数据处理中,经常会遇到类似这样的情况:数据库中存在多条记录,其中某些字段值相同,其他字段值不同.实际的业务需要针对这样的情况,只保留一条数据,其他数据删除.如何做到呢?在sql中有top关键字相对容...
  • tlucia
  • tlucia
  • 2013-07-03 11:32:25
  • 4736

mysql 重复记录只选取最后一条

1. 使用 EXISTS 和 NOT EXISTS参数 // sid相同,create_time不同,取create_time最后一条 SELECT id, sid FROM table_name ...
  • x85083420
  • x85083420
  • 2015-10-14 09:56:56
  • 4908

Oracle删除重复记录只保留一条数据的几种方法

Oracle删除重复记录只保留一条数据的几种方法 1. 问题描述 BBSCOMMENT表为BBSDETAIL的从表,记录商户评价信息。因为数据倒腾来倒腾去的,有很多重复数据。表结构如下: C...
  • haiross
  • haiross
  • 2014-08-12 11:53:40
  • 23790
    个人资料
    持之以恒
    等级:
    访问量: 10万+
    积分: 1844
    排名: 2万+
    最新评论