首页 > 数据库 >oracle 表数据指定表字段,并筛选出重复项

oracle 表数据指定表字段,并筛选出重复项

时间:2024-07-08 10:52:14浏览次数:12  
标签:work 表字 value number date oracle 筛选 数据 row

之前线上遇到了个问题,需要临时处理一下同步过来的数据,删除重复项,当时没写出来这个sql,泪目.....
正好空下来了,理一下怎么写这个sql

sql主要用到的还是 row_number这个函数,他会为根据指定条件,每行数据分配一个序号
语法格式:row_number() over(partition by 分组列 order by 排序列 desc)

先把表结构列一下:
uuid varchar2(32) primary key
userid varchar2(32)
work-date date
value number

因对接方数据存在问题,导致出现 相同的userid, work-date, value 有两条相同的数据,现在需要删除重复的数据
筛选sql写法:

SELECT * FROM (
SELECT uuid, row_number() over(partition BY USERID, work-date, value order by UUID) rn, USERID, work-date, value 
FROM table.data
) t WHERE t.rn >1;

简单解释,先通过 USERID, work-date, value 分组,查出来 每条数据的row_number
在通过row_number 筛选出 序号大于1 的,则能查询出所有重复的数据
最后按照 查出来的 uuid 删除就可以实现去重了

如果表设计的时候,没有uuid这种唯一标识字段,可以先查出来所有重复数据,再删除所有重复的数据,最后把数据插入进去,这样也能实现去重的效果
这个 主要用的oracle 函数还是 row_number这个函数,记录一下,以免下次用的时候想不起来~

说句题外话,在表设计的时候,需要考虑一下排查问题可能用到的字段,比如这次的表虽然把数据存下来了,但是没有对方传的username,我们通过 username 去映射到指定的userid,这样如果数据出了问题,也不清楚是哪条数据
此外,同步时间也可以加上,单看表数据,也不知道是什么时间点写入的,线上的业务在实时用这张表的数据,数据存在问题可以通过同步时间字段,快速判断是否最新的数据

第二点,对面提供的是个分页接口,实际上这么写是有问题的,场景是我们每四个小时会调用他们的接口获取所有的数据,先删后增数据
如果在接口调用期间,数据分页的位置出现变动,则同样会导致同步过来的数据重复的问题

标签:work,表字,value,number,date,oracle,筛选,数据,row
From: https://www.cnblogs.com/charler/p/18289472

相关文章

  • 前端JS特效第20集:HTML5图片瀑布流带筛选功能代码
    HTML5图片瀑布流带筛选功能代码,先来看看效果:部分核心的代码如下(全部代码在文章末尾):<!DOCTYPEhtml><htmllang="en"class="no-js"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,init......
  • Oracle死锁解决方式
    死锁是指在Oracle数据库中,两个或多个事务相互等待对方持有的锁资源,导致它们无法继续执行下去,从而形成死锁现象解决方式如下:查询死锁信息:selectSID,USERNAME,LOCKWAIT,STATUS,MACHINE,PROGRAM,EVENTfromV$SESSIONwhereSIDin(selectSESSION_IDfromV$LOCKED_OBJECT)......
  • Oracle数据库高可用性研究与分析(毕业论文)
    摘要本文深入研究了Oracle数据库的高可用技术,重点探讨了RAC(实时应用集群)、DataGuard、ASM(自动存储管理)以及RMAN(恢复管理器)等核心组件的原理与框架。通过构建一套以“RAC+RMAN”为核心的高可用架构,本文旨在为企业提供一套高性能、高可用且高稳定的数据库环境。该架构不仅......
  • Oracle语法
    OracleOracle数据和Mysql数据库都是十分常见的数据库,使用都很广泛,使用过的人会发现在写sql语句时两者之间大多数语法是相通的,但是也有一些地方语法不一样,今天我们一起来浅聊一下它们的区别吧1.dual1.oracle中select语句后边的from是不能省略的,如果没有实际的表,可以用dual作为fr......
  • Oracle PL / SQL INTERVAL数据类型
    INTERVALYEARTOMONTH数据类型INTERVALYEARTOMONTH存储和操作年和月的间隔。语法是:INTERVALYEAR[(precision)]TOMONTHprecision指定“years”字段中的数字位数。我们必须在0..4的范围内使用整数字面值。默认值为2。以下代码显示如何将字面值分配到INTERVALY......
  • Oracle PL / SQL变量范围
    变量范围指的是当另一个PL/SQL块可以看到声明的项目时。在函数或过程的声明部分中声明的任何项只在同一函数或过程中可见。在包主体的声明部分中声明的任何项只在同一包主体中的任何其他项内可见。在包规范中声明的任何项目对于调用方法的所有者具有执行特权的任何其他存......
  • Oracle闪回(Flashback)功能简介
        在Oracle数据库中,ASOFTIMESTAMP语法用于使用时间戳技术访问特定时间之前的数据,或者说把数据库回滚到某个时间点以前的状态。它基于Oracle的时间戳功能,允许用户查询某个表在特定时间点的快照。其语法如下:SELECT<COLUMNS>FROM<TABLE>ASOFTIMESTAMP<TIMESTAMP>......
  • Oracle实例启动阶段的详细解析
    Oracle数据库实例的启动过程是一个多阶段的过程,每个阶段都有特定的操作和目的。以下是每个启动阶段的详细解析:1.启动实例(InstanceStartup)命令:STARTUPNOMOUNT主要操作:(1)分配内存:分配系统全局区(SGA),SGA是一组共享内存结构,用于存储数据库数据和控制信息。(2)启动后台进程:启动各......
  • 关于oracle中的undo
    一,undo介绍二,undo视图说明三,常用脚本说明四.释放UNDO表空间五.参考一,undo介绍Oracle中undo的作用主要有两个:第一是回滚事务,第二是产生一致性读。同时也衍生出了一些新的功能,比如Flashbackquery。传统的undo是通过undosegment来管理的,我们看下面的示例:详见第二篇文章......
  • Oracle数据库的日志切换策略
    Oracle数据库的日志切换策略是确保数据库稳定运行和事务连续性的关键机制之一。以下是对Oracle日志切换策略的详细解析1、自动日志切换1.1、重做日志切换:Oracle数据库使用重做日志文件(RedoLogFiles)来保证实例恢复。当当前的重做日志文件写满时,Oracle会自动进行日志切换......