1我需要对这样的表进行重复数据删除: -
name | fix | mobile
-----+-----+---------
dan | 1 | 1
jon | 1 | 3
mia | 1 | 4
ken | 5 | 4
我想得到: -
dan | 1 | 1
jon | | 3
mia | | 4
ken | 5 |
可以使用Excel,但对于500k行,我得到'not responding'
如果找到重复,则访问删除整行。
例如: 设置主键修复,我得到: -
dan | 1 | 2
ken | 5 | 4
在mobil
上设置主键,我得到: -
dan | 1 | 1
jon | 1 | 3
mia | 1 | 4
SQL或其他程序可以这样做吗?我试图使用distinct或group by,但我找不到合适的公式。
答案 0 :(得分:3)
在sql中是可能的。我确实写过sql code.let并说你在表中有id列,你的表名是人。我编写了用于更新' 修复'的代码柱。诀窍是自己加入桌子。 如果您有任何疑问,请随时提出。
update temp1 set temp1.fix=''
from people temp1 inner join people temp2
on temp1.fix=temp2.fix where temp1.id>temp2.id
答案 1 :(得分:1)
使用此查询:
SELECT
t.NAME,
IIF(t.partRankFix = 1, t.fix, NULL) AS fix,
IIF(t.partRankMobile = 1, t.mobile, NULL) AS mobile
,A.field1, A.field2
FROM (
SELECT
A.Name, A.Fix, A.mobile
, Sum(IIF(A.fix = B.fix OR A.fix=B.mobile, 1, 0)) AS partRankFix
, Sum(IIF(A.mobile = B.mobile AND A.mobile = B.fix, 2,
IIF(A.mobile = B.mobile OR A.mobile = B.fix, 1, 0))) AS partRankMobile
, A.field1, A.field2
FROM
yourTable AS A,
yourTable AS B
WHERE
(((Nz(A.fix, 0) < Nz(B.fix, 0)) OR (Nz(B.fix, 0) = Nz(A.fix, 0))) AND (Nz(B.NAME, 0) >= Nz(A.NAME, 0)))
GROUP BY
A.Name, A.Fix, A.mobile, A.field1, A.field2) AS t
答案 2 :(得分:1)
这个模块应该完成这项工作。我使用了原始表的副本(此处我将其命名为Public Function Dedup()
Dim rstSource As DAO.Recordset
Dim rstDestination As DAO.Recordset
Dim deduppreviousValue As Long
Dim dedupValue As Long
Dim blnInit As Boolean
Set rstSource = CurrentDb.OpenRecordset("Select * from Table1 order by Fix,Mobile")
Set rstDestination = CurrentDb.OpenRecordset("dedup")
With rstSource
.MoveFirst
blnInit = False
While Not .EOF
dedupValue = .Fields("fix")
rstDestination.AddNew
rstDestination.Fields("NameID") = .Fields("nameID")
If Not blnInit Then
rstDestination.Fields("fix") = .Fields("fix")
blnInit = True
Else
If deduppreviousValue <> dedupValue Then
rstDestination.Fields("fix") = .Fields("fix")
Else
End If
End If
rstDestination.Fields("mobile") = .Fields("mobile")
rstDestination.Update
deduppreviousValue = .Fields("fix")
.MoveNext
Wend
End With
End Function
)名为dedup
C:\Windows\System32\drivers\etc\hosts.ics
答案 3 :(得分:0)
好的,我通过这个例子达到了它。
- 首先我创建一个表来处理:
CREATE TABLE #Table (field1 INT, field2 INT, field3 int)
- 然后我用类似于你的数据填写字段:
INSERT INTO #Table VALUES(1,2,3)
INSERT INTO #Table VALUES(2,2,4)
INSERT INTO #Table VALUES(3,2,5)
INSERT INTO #Table VALUES(4,3,5)
- 最后通过以下查询,您可以找到您所寻找的内容:
SELECT t1.field1,t2.field2,t3.field3 from #Table t1
left join
(select field2,min(field1) AS field1 from #Table group by field2) t2
on t1.field1 = t2.field1 left join
(select field3,min(field1) AS field1 from #Table group by field3) t3
on t1.field1 = t3.field1
关键是要为每个要进行重复数据删除的字段使用相同的表进行左连接,并始终与相同的字段“field1”匹配。 在每个表中,您必须按要删除重复数据的字段进行分组。
希望它有所帮助。