Registros duplicados

313 views
Skip to first unread message

Victor Hugo Mm

unread,
Jan 22, 2014, 2:36:41 PM1/22/14
to publice...@googlegroups.com
Buenas tardes, tengo una tabla con 154.869 registros y 32 campos.  Por favor necesito una instrucción que me envíe a otra tabla los registros que están duplicados en todos los campos.  He buscado en google y solo encuentro como listar los registros con uno o dos campos duplicados.

Por su ayuda, a todos mil gracias.

edgar suarez kummers

unread,
Jan 22, 2014, 2:51:52 PM1/22/14
to publice...@googlegroups.com
Puedes hacer a la inversa en forma fácil, es decir que solamente envíe a otra tabla aquellos que no sean duplicados.

SELECT * DISTINCT FROM original.dbf INTO TABLE norepetido.dbf


Luis Maria Guayan

unread,
Jan 22, 2014, 2:58:04 PM1/22/14
to publice...@googlegroups.com
Mira si esto te ayuda

--- Buscar registros repetidos ---
http://www.portalfox.com/article.php?sid=2098

--- Comparar dos registros ---
http://www.portalfox.com/article.php?sid=1999


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

El 22/01/2014 16:36, Victor Hugo Mm escribió:

Viktor Velazquez

unread,
Jan 22, 2014, 3:00:44 PM1/22/14
to publice...@googlegroups.com
esi es para duplicados en los registros 
pero dice que no esten duplicados en todos los campos no en todos los registros.. ...



From: edgark...@gmail.com
Date: Wed, 22 Jan 2014 14:51:52 -0500
Subject: Re: [vfp] Registros duplicados
To: publice...@googlegroups.com

edgar suarez kummers

unread,
Jan 22, 2014, 4:06:55 PM1/22/14
to publice...@googlegroups.com
A ver, 32 campos buscando siempre hasta dos campos que sean iguales entre los ciento y pico mil de registros, es una progresión matemática que la puedes realizar utilizando matrices, o los llamados ARRAY de VFP9.0.

De hecho yo lo hago (algo parecido) en forma rutinaria, pero debes primero incorporar un campo adicional a la tabla donde si encuentra algún tipo de repetición marque de alguna forma el registro posterior para luego ser transcrito.

Pero te advierto, como dice mi dulce esposa campesina, se demora más que "polvo de marrano" (cerdo) el proceso, más el tiempo largo de la hechura del código.

Primero, luego de agregar el campo para igualdades pasas a un ARRAY

Select * from original.dbf into ARRAY miarray

*****************************************************************************
for alfa = 1 to numregistros - 1
for beta = alfa + 1 to numregistros
if miarray(alfa,numcampo1) = miarray(beta,numcampo1);
.and. miaarray(alfa,numcampo2) = miarray(beta,numcampo2) then
miarray(beta,numcampoiguales) = "igual"
endif
next
endfor
****************************************************************************

Esto anterior acotado entre ********************* hay que hacerlo muchas veces

Luego creas una tabla igual a la original, pero con otro nombre, pero sin registros:

Y recorriendo todos los registros haces un APPEND o un INSERT

de aquellos registros marcados "igual" desde el ARRAY

Ojo: despues de procesar los campos 1 y 2 te faltan los 1 y 3, ...., hasta 1 y 32
luego los 2 y 3 ........... hasta 2 y 32
luego ,,,,,l......... hasta que llegues a

31 y 32

Obviamente supongo que compararás manzanas con manzanas y peras con peras o sea siempre dos campos que tengan la misma definición.

Posdata, no olvides alentar al marrano, (cerdo).

Ahora, que si deseas apenas comparar por un solo campo sí te toca evaluarlos todos porque es un campo contra sí mismo. ( manzanas con manzanas)

Víctor Hugo Espínola Domínguez

unread,
Jan 22, 2014, 4:18:46 PM1/22/14
to publicesvfoxpro
Hola tocayo

SELECT *, COUNT(*) AS CantReg FROM tuTabla GROUP BY 1,2,3,4,..,32 HAVING CantReg > 1

No se cuál es el límite de números de columnas en la cláusula GROUP BY, prueba y nos cuentas.

Saludos,
Víctor.
Lambaré - Paraguay.


Jorge Kiernan

unread,
Jan 22, 2014, 5:16:59 PM1/22/14
to publicesvfoxpro
proba con la funcion sys(2017) que calcula un cheksum en base al registro de la tabla, tomado como si fuera un solo campo, y supuestamente único para cada combinación de datos. Algo asi como:
sele SELECT SYS(2017) as chksum, campoclave from mitabla into cursor cursor1 readwrite
index on chksum tag chksum
sele chksum, sum(1) as duplicados from cursor1 order by chksum group by chksum into cursor2
scan for duplicados > 1 
        aqui buscas en el cursor1 los que tengan ese chksum y ves que haces
        (lo pones en un tercer cursor, o que se yo)
endscan 
Suerte.

Victor Hugo Mm

unread,
Jan 23, 2014, 6:07:58 PM1/23/14
to publice...@googlegroups.com
Buenas tardes, no me sirve la tabla quitando duplicados.  Necesito saber cuales están duplicados, enviarlos a otra tabla y pasar al departamento de estudios de mi empresa para que los mu..erganos hagan bien su trabajo y pongan bien los datos.

edgar suarez kummers

unread,
Jan 23, 2014, 6:23:00 PM1/23/14
to publice...@googlegroups.com
Una idea, si consigues dbfview puedes exportar ambas tablas, la original.dbf y la norepetido.dbf a archivos de texto, aunque también se puede hacer desde VFP9.0

Luego bajas a WINMERGE y comparas los dos textos y allí sí te salen las diferencias.

Yo lo haría la comparación con BEYOND COMPARE y la exportación con DBFVIEW

Pero lo puedes hacer exportando desde Visual Foxpro y comparando con WINMERGE.

Puedes hacer a la inversa en forma fácil, es decir que solamente envíe a otra tabla aquellos que no sean duplicados.

SELECT * DISTINCT FROM original.dbf INTO TABLE norepetido.dbf



mpulla

unread,
Jan 23, 2014, 6:34:01 PM1/23/14
to publice...@googlegroups.com
Hola Victor.

Si tienes tu data en dbf y no te queda de otra, puedes subir tu data a Sql Server y utilizar Sql Data Compare es de pago pero puedes probarla por 14 días

Saludos.
Mauricio

Fidel Charny

unread,
Jan 23, 2014, 6:40:42 PM1/23/14
to publice...@googlegroups.com
Siguiendo la idea de jkiernan, podés intentar algo como esta rutina, adaptándola a tu caso

LOCAL lnCrc,i

LOCAL ARRAY gashut(2)
gashut[3]="repeti"
gashut[4]="CurPadron"
FOR I=1 TO ALEN(GASHUT)
IF USED(gaShut[i])
SELECT (gaShut[i])
USE
ENDIF
ENDFOR

&& crea una tabla vacía
SELECT *,CAST(0 as N(14,0)) as sumaCrc ;
FROM clientes WHERE .f. INTO DBF Repeti 
&& crea un cursor con todos los datos de la tabla Clientes + el campo SumaCrc
SELECT *,CAST(0 as N(14,0)) as sumaCrc ;
FROM clientes WHERE .t. INTO CURSOR curPadron readwrite

&& Calcula los CRC
SELECT curpadron
SCAN
replace sumaCrc WITH VAL(SYS(2017, "",1,1))
ENDSCAN
INDEX on sumaCrc TAG isumacrc
GO top
lnCrc=0
SCAN
IF SumaCrc = lnCrc
SCATTER memvar
INSERT INTO repeti FROM memvar
ENDIF
lnCrc=SumaCrc
ENDSCAN
SELECT CURPADRON
USE
SELECT repeti
Messagebox(transform(Reccount())+" registros repetidos.")
GO top
BROWSE

Si no querés comparar todos los campos
Colocas la lista de campos en ambos cursores

o usás Sys(2017, Lista_de_Campos_Excluidos , 1 , 1)

Víctor Hugo Espínola Domínguez

unread,
Jan 23, 2014, 8:15:44 PM1/23/14
to publicesvfoxpro
Hola tocayo

La solución que te envié funciona Ok, ahí va otra:

SELECT * FROM tuTabla                                    ;
     GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,          ;
              13,14,15,16,17,18,19,20,21,22,23,24,  ;
              25,26,27,28,29,30,31,32                       ;
     HAVING COUNT(*) > 1

Saludos,
Víctor.
Lambaré - Paraguay.

edgar suarez kummers

unread,
Jan 23, 2014, 8:39:10 PM1/23/14
to publice...@googlegroups.com
Buenas Victor Hugo Espinola Dominguez, ........... , 

Cuantas veces va a hacer el proceso que tú describes, ..........,

Para que no quede nada sin estudiar ?

Muy interesante tu solución.



Víctor Hugo Espínola Domínguez

unread,
Jan 23, 2014, 9:17:16 PM1/23/14
to publicesvfoxpro
Hola Edgar

No entendí muy bien tu pregunta, pero el comando que le sugerí genera un cursor con los registros repetidos y dicho cursor lo puede copiar a una tabla o generar un reporte. Y se ejecuta una sola vez, lo que no tengo NPI es cuánto tiempo tardará en ejecutarse.

Saludos,
Víctor.
Lambaré - Paraguay.

Alejandro Isla

unread,
Jan 23, 2014, 10:03:34 PM1/23/14
to publice...@googlegroups.com
Para aclarar la constante universal NPI, con el método genérico a mi me dio así, en mi pc y con mi tabla les comento que trabajando en Mysql una base con 32 campos (si la vida está llena de coincidencias)  y unos 460.000 registros me tomó 16 segundos ejecutar la consulta, pero esta tabla no posee ningún registro duplicado (resultado tabla vacía). Nosotros si somos buenos cargando los datos :-)

Otro útil aporte de mi parte a la humanidad.

Saludos.

Víctor Hugo Espínola Domínguez

unread,
Jan 23, 2014, 10:30:18 PM1/23/14
to publicesvfoxpro
Hola tocayo

Si la tabla es nativa el siguiente código te mostrará los repetidos con el número de registro correspondiente.

Select * From tuTablaDbf ;
GROUP By 1,2,3,4,5,6,7,8,9,10,11,12, ;
13,14,15,16,17,18,19,20,21,22,23,24, ;
25,26,27,28,29,30,31,32              ;
HAVING Count(*) > 1 ;
INTO Cursor c1

Select Sys(2017) As cs From c1 Into Cursor c2

Select tuTablaDbf.*, Recno() As NroReg From tuTablaDbf;
Left Join c2 On Sys(2017) = c2.cs ;
HAVING Not Isnull(c2.cs) ;
ORDER By  1,2,3,4,5,6,7,8,9,10,11,12,          ;
13,14,15,16,17,18,19,20,21,22,23,24, ;
25,26,27,28,29,30,31,32

Saludos,
Víctor.
Lambaré - Paraguay.

edgar suarez kummers

unread,
Jan 24, 2014, 3:30:42 AM1/24/14
to publice...@googlegroups.com
Buenas Victor Hugo Espinola Dominguez:

Muy buena tu solución. Felicitaciones.
Reply all
Reply to author
Forward
0 new messages