oracle数据删重关联取最近值

qq_36934345 2016-12-29 08:43:48
...全文
474 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36934345 2016-12-30
  • 打赏
  • 举报
回复
[quote=引用 22 楼 js14982 的回复:] row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn 你的意思就是说按身份证和产品来分组喽。 改成 row_number()over(partition by a.身份证,a.产品 order by a.日期戳 desc,b.日期戳 desc) rn[/quote 用decode()函数怎么加
qq_36934345 2016-12-30
  • 打赏
  • 举报
回复
[quote=引用 22 楼 js14982 的回复:] row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn 你的意思就是说按身份证和产品来分组喽。 改成 row_number()over(partition by a.身份证,a.产品 order by a.日期戳 desc,b.日期戳 desc) rn[/quo 好的,我懂了,还有一个问题就是,如果我数据库里面有已经服务的客户和未服务的客户,我可以加条什么语句将“已服务”这个条件加进去呀,谢谢
js14982 2016-12-30
  • 打赏
  • 举报
回复
row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn 你的意思就是说按身份证和产品来分组喽。 改成 row_number()over(partition by a.身份证,a.产品 order by a.日期戳 desc,b.日期戳 desc) rn
qq_36934345 2016-12-30
  • 打赏
  • 举报
回复
引用 19 楼 js14982 的回复:
select id,编号,工资,身份证,日期戳,电话,手机 from (select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机, row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn from a,b where a.身份证 = b.身份证) t where t.rn = 1 ; 这个语句是取身份证唯一的一条数据,取时间戳最近的
今天新想到一个问题,就是这种我把重复的都删了只保留一种,但是有时候有些列要保证有重复,比如同一个人买了两个产品,要把他买的产品都显示出来,那么会出现重复的名字,客户编号,身份证号码,这样的话可以怎么改呀...
qq_36934345 2016-12-29
  • 打赏
  • 举报
回复
采用4楼的写法,但是报右括号缺省的错误,请问怎么解决
qq_36934345 2016-12-29
  • 打赏
  • 举报
回复
非常感谢大家,作为一个新手,问的问题有点LOW哈,以后还要多麻烦大家帮忙解答,谢谢
js14982 2016-12-29
  • 打赏
  • 举报
回复
select id,编号,工资,身份证,日期戳,电话,手机
from
(select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机
       row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn
from a,b
where a.身份证 = b.身份证) t
where t.rn = 1
;
H_Gragon 2016-12-29
  • 打赏
  • 举报
回复
引用 2 楼 qq_36934345 的回复:
@ zbdzjx 谢谢,请问A和aa都是指表名么?还有这是删重取现操作,后面还有加上select A.1,A.2,A.3,...B.电话,B.手机...from A,B where(A.身份证=B.身份证); 么
A就是你说问题中的A表,aa是一个去除重复后的虚拟表虚拟表
select  aa.ID,aa.编号,aa.姓名,aa.工资,aa.身份证,aa.日期戳,bb.电话,bb.手机  from 
(select * from A where (身份证, 日期戳) in (select 身份证, max(日期戳) 日期戳 from A group by 身份证)) aa
left join
(select * from B where (身份证, 日期戳) in (select 身份证, max(日期戳) 日期戳 from A group by 身份证)) bb
on aa.身份证=bb.身份证
qq_36934345 2016-12-29
  • 打赏
  • 举报
回复
@ zbdzjx 谢谢,请问A和aa都是指表名么?还有这是删重取现操作,后面还有加上select A.1,A.2,A.3,...B.电话,B.手机...from A,B where(A.身份证=B.身份证); 么
zbdzjx 2016-12-29
  • 打赏
  • 举报
回复
大致如下,但是有一点,身份证+日期戳 必须唯一。
select * from 
(select * from A where (身份证, 日期戳) in (select 身份证, max(日期戳) 日期戳 from A group by 身份证)) aa
left join
(select * from B where (身份证, 日期戳) in (select 身份证, max(日期戳) 日期戳 from A group by 身份证)) bb
on aa.身份证=bb.身份证
js14982 2016-12-29
  • 打赏
  • 举报
回复
select id,编号,工资,身份证,日期戳,电话,手机 from (select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机, row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn from a,b where a.身份证 = b.身份证) t where t.rn = 1 ; 这个语句是取身份证唯一的一条数据,取时间戳最近的
js14982 2016-12-29
  • 打赏
  • 举报
回复
你的重复数据仅仅是时间戳的值不一样么?
qq_36934345 2016-12-29
  • 打赏
  • 举报
回复
引用 13 楼 beyon2008 的回复:
select a.id, a.编号, a.工资, a.身份证, a.日期戳, b.电话, b.手机 from a inner join b on a.身份证 = b.身份证 执行这个看看有没记录,如果没记录,就是数据有问题了,根据身份证号关联不上记录
谢谢,是我书写错误,居然没报错...
qq_36934345 2016-12-29
  • 打赏
  • 举报
回复
引用 11 楼 js14982 的回复:
select id,编号,工资,身份证,日期戳,电话,手机 from (select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机, row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn from a,b where a.身份证 = b.身份证) t where t.rn = 1 ; 只有表头没结果,表示 a.身份证 = b.身份证 没有数据匹配到? 比如说出现了空格了什么的。 你直接执行 select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机, row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn from a,b where a.身份证 = b.身份证 看看有结果没
额,不好意思,写错个字段啦,有结果输出,这样可以就可以将两个表的重复内容都去掉了吧并且保留最近的一行数据?
js14982 2016-12-29
  • 打赏
  • 举报
回复
看看你身份证信息到底匹配的上不,有没空格? 去掉空格试试 where trim(a.身份证) = trim(b.身份证)
qq_36934345 2016-12-29
  • 打赏
  • 举报
回复
引用 11 楼 js14982 的回复:
select id,编号,工资,身份证,日期戳,电话,手机 from (select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机, row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn from a,b where a.身份证 = b.身份证) t where t.rn = 1 ; 只有表头没结果,表示 a.身份证 = b.身份证 没有数据匹配到? 比如说出现了空格了什么的。 你直接执行 select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机, row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn from a,b where a.身份证 = b.身份证 看看有结果没
引用 11 楼 js14982 的回复:
select id,编号,工资,身份证,日期戳,电话,手机 from (select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机, row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn from a,b where a.身份证 = b.身份证) t where t.rn = 1 ; 只有表头没结果,表示 a.身份证 = b.身份证 没有数据匹配到? 比如说出现了空格了什么的。 你直接执行 select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机, row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn from a,b where a.身份证 = b.身份证 看看有结果没
没有结果
beyon2008 2016-12-29
  • 打赏
  • 举报
回复
select a.id, a.编号, a.工资, a.身份证, a.日期戳, b.电话, b.手机 from a inner join b on a.身份证 = b.身份证 执行这个看看有没记录,如果没记录,就是数据有问题了,根据身份证号关联不上记录
beyon2008 2016-12-29
  • 打赏
  • 举报
回复
select id, 编号,工资,身份证,日期戳, 电话,手机 from (select a.id, a.编号, a.工资, a.身份证, a.日期戳, b.电话, b.手机, row_number() over(partition by a.身份证 order by a.日期戳 desc, b.日期戳 desc) rn from a inner join b on a.身份证 = b.身份证) t where t.rn = 1;
js14982 2016-12-29
  • 打赏
  • 举报
回复
select id,编号,工资,身份证,日期戳,电话,手机 from (select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机, row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn from a,b where a.身份证 = b.身份证) t where t.rn = 1 ; 只有表头没结果,表示 a.身份证 = b.身份证 没有数据匹配到? 比如说出现了空格了什么的。 你直接执行 select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机, row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn from a,b where a.身份证 = b.身份证 看看有结果没
qq_36934345 2016-12-29
  • 打赏
  • 举报
回复
引用 4 楼 js14982 的回复:
select id,编号,工资,身份证,日期戳,电话,手机
from
(select a.id,a.编号,a.工资,a.身份证,a.日期戳,b.电话,b.手机
       row_number()over(partition by a.身份证 order by a.日期戳 desc,b.日期戳 desc) rn
from a,b
where a.身份证 = b.身份证) t
where t.rn = 1
;
在我把所有小问题都改啦,发现输出值为0.....只有表头没得结果
加载更多回复(4)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧