| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2398 人关注过本帖
标题:对重复记录标注
只看楼主 加入收藏
fcwtr
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2016-7-8
结帖率:30%
收藏
已结贴  问题点数:10 回复次数:8 
对重复记录标注
表A,
字段: ID、 BB 、 CC 、DD 、 EE 、 FF
如果记录中  符合BB相同、CC相同、DD相同、EE相同
视为记录重复,
修改第一条记录FF=0,其他相同的修改记录FF=1


[此贴子已经被作者于2016-9-20 13:56编辑过]

2016-09-20 10:43
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:5 
1、第1条记录?什么才算是第1条。要是有个ID号或者是时间,就可以知道那个是第1条。如用时间 dt
update 表a set ff=0 from (
select top min(dt)as dt,BB,CC,DD,EE,FF from 表A group by BB,CC,DD,EE,FF order by dt desc)b
where 表a.dt=b.dt and 表a.bb=b.bb and 表a.cc=b.cc and 表a.dd=b.dd and 表a.ee=b.ee

update 表a set ff=1 from (
select top min(dt)as dt,BB,CC,DD,EE,FF from 表A group by BB,CC,DD,EE,FF order by dt desc)b
where 表a.dt<>b.dt and 表a.bb=b.bb and 表a.cc=b.cc and 表a.dd=b.dd and 表a.ee=b.ee
没测试,应该是这样

2016-09-20 12:39
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:991
专家分:4966
注 册:2013-2-16
收藏
得分:5 
没测试楼上的代码,不过他讲的是对的,要有一个可以区分记录的字段(比如ID号,或其它什么号),否则,这个“第1条”、“第2条”就无从谈起,SQL Server 面向的是记录集 。
2016-09-20 13:28
fcwtr
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2016-7-8
收藏
得分:0 
回复 2楼 mywisdom88
增加一个主键ID
参考其他人的方法:差别太大了
一、
with m as (
select *, row_number(partition by BB,CC,DD,EE,FF order by id ) rn from test
)
update m
set FF =sign(rn -1)

二、
with T as
 (select *,rn=row_number() over (partition by BB,CC,DD,EE order by BB) from A)
 update T set FF=case when rn=1 then 0 else 1 end

三、
UPDATE t SET FF=SIGN(rn-1) FROM (select *,rn=row_number() over (partition by BB,CC,DD,EE order by FF) from A) AS t


四、
UPDATE A
SET FF = (CASE WHEN BB = cc AND CC = DD AND DD = EE THEN 0 ELSE 1 END)
select * FROM A
2016-09-20 16:48
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用fcwtr在2016-9-20 16:48:34的发言:

增加一个主键ID
参考其他人的方法:差别太大了
一、
with m as (
select *, row_number(partition by BB,CC,DD,EE,FF order by id ) rn from test
)
update m
set FF =sign(rn -1)

二、
with T as
 (select *,rn=row_number() over (partition by BB,CC,DD,EE order by BB) from A)
 update T set FF=case when rn=1 then 0 else 1 end

三、
UPDATE t SET FF=SIGN(rn-1) FROM (select *,rn=row_number() over (partition by BB,CC,DD,EE order by FF) from A) AS t


四、
UPDATE A
SET FF = (CASE WHEN BB = cc AND CC = DD AND DD = EE THEN 0 ELSE 1 END)
select * FROM A


row_number()是SQL2005还是2008版本以上才有的,SQL2000版本是没有的。
第1,2,3等方法是在SQL2000上是不能运行的。
第4方法,他更新条件是 BB = cc AND CC = DD AND DD = EE,不符合你的要求。
2016-09-20 17:28
fcwtr
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2016-7-8
收藏
得分:0 
回复 5楼 mywisdom88
2016-09-20 20:22
fcwtr
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2016-7-8
收藏
得分:0 
回复 5楼 mywisdom88
谢谢!
但提示:
出错信息:
第 2 行: 'min' 附近有语法错误。
2016-09-21 10:13
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用fcwtr在2016-9-21 10:13:48的发言:

谢谢!
但提示:
出错信息:
第 2 行: 'min' 附近有语法错误。

min(dt) as dt,我是举例,如增加1个日期字段,名称叫dt.....................
2016-09-21 13:34
fcwtr
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2016-7-8
收藏
得分:0 
回复 8楼 mywisdom88
我已经增加了一个ID,
2016-09-21 13:51
快速回复:对重复记录标注
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017248 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved