none
Eliminar duplicado de una consulta RRS feed

  • Pregunta

  • Holas tengo lo siguiente

    Loc   Interfaz    Fecha

    19 C01356 20/05/17
    19 C01356 21/05/17
    19 C01392 22/05/17
    19 C01399 22/05/17
    40 C01389 20/05/17
    40 C01399 20/05/17
    40 C01389 21/05/17
    40 C01399 21/05/17

    Tengo un select que me busca duplicado de local y fecha:

     SELECT te.POUPMT,te.podgj,count(*)
          FROM ESAP.F550911 te   where PODGJ between '20-MAY-2017'AND '22-MAY-2017'   
          GROUP BY te.POUPMT,te.podgj
          HAVING count (*) > 1
          ORDER BY 1 DESC

    Lo que quiero es dejar solo un registro y eliminar el que tenga menor interfaz(si son C01389 y C01399, deberìa solo queda la C01399).

    Solo debería volver lo siguiente:

    Local   Interfaz    Fecha

    19 C01356 20/05/17
    19 C01356 21/05/17
    19 C01399 22/05/17
    40 C01399 20/05/17
    40 C01399 21/05/17

    Favor de su apoyo.

    Gracias :)


    Desarrolladora

    viernes, 9 de junio de 2017 0:35

Respuestas

Todas las respuestas

  • Esta consulta debe servir, claro si se trata de SQL Server y una versión 2012 o superior.

    WITH T AS
    (
        SELECT 
    	   te.POUPMT, te.podgj, 
    	   ROW_NUMBER() OVER(PARTITION BY te.POUPMT, te.podgj ORDER BY te.interfaz DESC) AS R
        FROM 
    	   ESAP.F550911 te   
        WHERE 
    	   PODGJ BETWEEN '20170520' AND '20170522'   
    )
    DELETE T WHERE R > 1
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 9 de junio de 2017 0:59
  • Estoy usando PLSQL

    Desarrolladora

    viernes, 9 de junio de 2017 14:34
  • Esta consulta debe servir, claro si se trata de SQL Server y una versión 2012 o superior.

    WITH T AS
    (
        SELECT 
    	   te.POUPMT, te.podgj, 
    	   ROW_NUMBER() OVER(PARTITION BY te.POUPMT, te.podgj ORDER BY te.interfaz DESC) AS R
        FROM 
    	   ESAP.F550911 te   
        WHERE 
    	   PODGJ BETWEEN '20170520' AND '20170522'   
    )
    DELETE T WHERE R > 1
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    oh pero  estoy usando PLSQL

    Desarrolladora

    viernes, 9 de junio de 2017 14:34
  • Lo siento, no puedo ayudarte con PL-SQL, de pronto algún colaborador nos eche una mano pero debes considerar que este es un foro de SQL Server, cuanto menos lo hubieses indicado al inicio aunque ya tenía mis sospechas y por eso te hice la observación del gestor y versión que acepta la solución propuesta. Quizá puedas obtener ayuda inmediata en los foros de ORACLE.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 9 de junio de 2017 15:16
  • Hola Rosita:

    Creo que la consulta de Williams te puede servir.

    tu tienes:

    SELECT te.POUPMT,te.podgj,count(*)
          FROM ESAP.F550911 te   where PODGJ between '20-MAY-2017'AND '22-MAY-2017'   
          GROUP BY te.POUPMT,te.podgj
          HAVING count (*) > 1
          ORDER BY 1 DESC

    Y yo creería que podría ser así:

    WITH t AS (SELECT te.POUPMT,te.podgj, CASE WHEN count(*)>=1 THNEN 1 ELSE 0 END as Control
          FROM ESAP.F550911 te   where PODGJ between '20-MAY-2017'AND '22-MAY-2017'   
          GROUP BY te.POUPMT,te.podgj
          HAVING count (*) > 1
          ORDER BY 1 DESC)
    SELECT POUPMT, podgj FROM t WHERE Control =1;

    Si tienes duda sobre el uso del With en Oracle, mira en este link.

    Saludos cordiales.


    Camilo Villa

    viernes, 9 de junio de 2017 21:48
  • la sintaxis para Oracle, al menos las ultimas versiones, también admite with, y creo que las funciones de windowing también. Pruebalo y nos dices.

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 12 de junio de 2017 6:36
    Moderador