登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: [mssql]处理重复行     [回主站]     [分站链接]
[mssql]处理重复行
clq
浏览(186) - 2019-02-22 13:48:35 发表 编辑

关键字: mssql

[2019-02-22 17:20:12 最后更新]
[mssql]处理重复行

目前的 sql server 2008 还是不能在 select 中改变变量的值。用 ROW_NUMBER() OVER ( ORDER BY b_time ) AS 行号
又要改变数据的原始序号,所以要用后面的 IDENTITY 放到临时表中
declare @i int;
select  @i=@i+1 from [t1].[dbo].[HA]
set @i=0;

update
   --   ,[id]
   [t1].[dbo].[HA] set id =
   
   (select @i=(select @i+1))
   --, @i=@i+1


--------------------------------
select IDENTITY(int,   1,   1) as id,* from HA

会返回 [Err] 42000 - [SQL Server]仅当 SELECT 语句中有 INTO 子句时,才能使用 IDENTITY 函数。

所以要使用一个中间表才行.

SELECT IDENTITY(int, 1,1) as id,

* into ZA2
  FROM [t1].[dbo].[ZA]

这样生成有行号的数据表,然后就可以处理重复行了。

---------------------------------
  SELECT --distinct  
  a.药品代码,
  max(id)
  FROM [t1].[dbo].[hA2] a
 
  group by a.药品代码

这样取得唯一行所在的 id,原理是 "药品代码" 重复的都通过 max(id) 取得了其中的一个 id ,当然也可以用 min 或者其他聚合函数

这是个非常巧妙的算法.

---------------------------------
最终代码为

SELECT * into C3
  FROM [t1].[dbo].[C2] c
 
  where c.id in (
 
    SELECT --distinct  
  --a.药品代码,
  max(id)
  FROM [t1].[dbo].[c2] a
 
  group by a.药品代码
 
  )

---------------------------------


clq  2019-02-22 17:20:12 发表 编辑


看到有网友写了类似算法的 mysql 版,转贴如下
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select   peopleId from   people group by   peopleId having count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId in (select   peopleId from people group by   peopleId   having count(peopleId) > 1)
and rowid not in (select min(rowid) from   people group by peopleId having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
(二)
比方说
在A表中存在一个字段“name”,
而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;
Select Name,Count(*) From A Group By Name Having Count(*) > 1
如果还查性别也相同大则如下:
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1
(三)
方法一
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0

  方法二

  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

  1、对于第一种重复,比较容易解决,使用
select distinct * from tableName

  就可以得到无重复记录的结果集。

  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp

  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)

  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

(四)查询重复
select * from tablename where id in (
select id from tablename
group by id
having count(id) > 1
)
---------------------
作者:longzhiwen888
来源:CSDN
原文:https://blog.csdn.net/longzhiwen888/article/details/46562193
版权声明:本文为博主原创文章,转载请附上博文链接!





总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1