runsql - Deduplicación por dos columnas
select sql access vba (4)
Es posible en sql. Escribí el código sql. Supongo que tienes una columna de identificación en la tabla y tu nombre de tabla es personas . Escribí el código para actualizar la columna '' corregir ''. El truco es unir la mesa consigo mismo. Si usted tiene alguna pregunta no dude en preguntar.
update temp1 set temp1.fix=''''
from people temp1 inner join people temp2
on temp1.fix=temp2.fix where temp1.id>temp2.id
1Es necesario deduplicar una tabla como esta: -
name | fix | mobile
-----+-----+---------
dan | 1 | 1
jon | 1 | 3
mia | 1 | 4
ken | 5 | 4
Quiero tener:-
dan | 1 | 1
jon | | 3
mia | | 4
ken | 5 |
Es posible con Excel, pero para 500k filas obtengo ''not responding''
Access elimina toda la línea si encuentra un duplicado.
ex: establece la clave principal en la corrección, obtengo: -
dan | 1 | 2
ken | 5 | 4
establecer la clave principal en mobil
, obtengo:
dan | 1 | 1
jon | 1 | 3
mia | 1 | 4
¿Puede SQL u otro programa hacer esto? He intentado usar distinct o group by, pero no encontré la fórmula correcta.
Este módulo debería hacer el trabajo. He usado una copia de tu tabla original (aquí la he llamado tabla1) llamada dedup
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
Use esta consulta:
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
Ok, lo alcancé con este ejemplo.
-Primero creo una tabla para trabajar con:
CREATE TABLE #Table (field1 INT, field2 INT, field3 int)
-Entonces llené los campos con datos similares a los tuyos:
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)
-Finalmente con la consulta a continuación puede llegar a lo que busca:
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
La clave es hacer una combinación a la izquierda con la misma tabla para cada campo que quiera deduplicar siempre haciendo coincidir con el mismo campo "campo1". En cada una de estas tablas, debe agrupar por el campo que desea deduplicar.
Espero eso ayude.