none
Eliminar Duplicados (diferentes columnas) RRS feed

  • Pregunta

  • Hola, buen día.

    Necesito eliminar registros duplicados de una bases de datos sólo por número telefónico, es decir sí tengo dos registros duplicados por algún número telefónico, necesito descartar uno y conservar uno, pero tengo esta estructura:

    NOMBRE TELEFONO1  TELEFONO2
    Alexandra 5555555555 2222222222
    Alexandra 3333333333 5555555555

    En este caso, 5555555555 se encuentra duplicado, pero no logró crear la sentencia que pueda darme la solución.

    ¿Podrían ayudarme, por favor? 

    Saludos.


    Irving Glez

    viernes, 22 de diciembre de 2017 18:14

Respuestas

  • Intenta transponer los valores de columnas a filas y "juntar" los valores iguales, la idea es preservar la "primera fila" de cada partición (debe haber una columna que nos permita distinguir el orden, para el ejemplo utilicé la columna 'ID')

    DECLARE @TableName table 
        (ID int, NOMBRE varchar(20), TELEFONO1 varchar(20), TELEFONO2 varchar(20))
    INSERT INTO @TableName VALUES
        (1, 'Alexandra', '5555555555','2222222222'),
        (2, 'Alexandra', '3333333333','5555555555'),
        (3, 'Alexandra', '4444444444','6666666666'),
        (4, 'Pablo', '1111111111','2222222222'),
        (5, 'Pablo', '2222222222','3333333333'),
        (6, 'Pablo', '2222222222','4444444444'),
        (7, 'Julian', '1111111111','2222222222'),
        (8, 'Julian', '3333333333','5555555555');
    
    WITH T AS
    (
        SELECT 
    	   t1.ID, ROW_NUMBER() OVER(PARTITION BY t1.NOMBRE, t2.FONO ORDER BY t1.ID) AS rn
        FROM
    	   @TableName t1
    	   CROSS APPLY (SELECT TELEFONO1 AS [FONO] UNION ALL SELECT TELEFONO2) t2
    )
    DELETE T WHERE rn > 1;
    SELECT * FROM @TableName;
    GO


    viernes, 22 de diciembre de 2017 20:11

Todas las respuestas

  • - ¿Cuál de las dos filas es la que deseas preservar? ¿cuál es el criterio?

    - En las dos filas que adjuntas hay tres valores distintos: 222222, 333333 y 555555, si eliminas una fila pierdes uno de los valores, ¿tienes previsto ese caso?

    viernes, 22 de diciembre de 2017 18:31
  • Sí, estoy consciente de eso, ese es criterio eliminar por telefono. Habría que eliminar el primero.

    Irving Glez

    viernes, 22 de diciembre de 2017 18:38
  • Intenta transponer los valores de columnas a filas y "juntar" los valores iguales, la idea es preservar la "primera fila" de cada partición (debe haber una columna que nos permita distinguir el orden, para el ejemplo utilicé la columna 'ID')

    DECLARE @TableName table 
        (ID int, NOMBRE varchar(20), TELEFONO1 varchar(20), TELEFONO2 varchar(20))
    INSERT INTO @TableName VALUES
        (1, 'Alexandra', '5555555555','2222222222'),
        (2, 'Alexandra', '3333333333','5555555555'),
        (3, 'Alexandra', '4444444444','6666666666'),
        (4, 'Pablo', '1111111111','2222222222'),
        (5, 'Pablo', '2222222222','3333333333'),
        (6, 'Pablo', '2222222222','4444444444'),
        (7, 'Julian', '1111111111','2222222222'),
        (8, 'Julian', '3333333333','5555555555');
    
    WITH T AS
    (
        SELECT 
    	   t1.ID, ROW_NUMBER() OVER(PARTITION BY t1.NOMBRE, t2.FONO ORDER BY t1.ID) AS rn
        FROM
    	   @TableName t1
    	   CROSS APPLY (SELECT TELEFONO1 AS [FONO] UNION ALL SELECT TELEFONO2) t2
    )
    DELETE T WHERE rn > 1;
    SELECT * FROM @TableName;
    GO


    viernes, 22 de diciembre de 2017 20:11