sql >> Base de Datos >  >> RDS >> Sqlserver

Eliminar registros duplicados de la vista

Debe tener registros duplicados para algunos/todos los números de reclamo, por lo que debe usar DISTINCT no trabajará. Considere una tabla simple como

Column1    |    Column2
-----------+------------
A          |    X
A          |    Y

Si desea solo un registro para Column1 =A, SQL no tiene forma de saber si colocar X o Y en Column2. Este es el mismo problema que tiene pero con 19 columnas, no 2. Debe implementar algún tipo de lógica sobre cómo decidir qué fila se mostrará para cada número de queja. Entonces, para la tabla anterior, si quisiera que X se mostrara en la Columna 2, usaría la siguiente consulta:

SELECT  Column1,
        Column2
FROM    (   SELECT  Column1,
                    Column2,
                    ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY Column2 ASC) [RowNumber]
            FROM    MyTable
        ) t
WHERE   RowNumber = 1

Aquí estoy usando el ROW_NUMBER() función para priorizar cada fila, luego solo muestra la que tiene la prioridad más alta. Si no me importara en qué orden salieron, podría usar algo como esto para elegir una fila al azar.

ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY NEWID()) [RowNumber]

Como no sé qué lógica aplicar a su consulta, no puedo publicar exactamente lo que necesita, pero puedo intentar ayudarlo a comenzar:

SELECT  [Complaint Number],
        [Complaint_For],
        [Total_Complaint_Qty],
        [Defects],
        [Customer Code ],
        [Location],
        [CutomerName],
        [KUNUM],
        [QMNUM],
        [Responsible_KAM]
FROM    (   SELECT  [Complaint Number],
                    [Complaint_For],
                    [Total_Complaint_Qty],
                    [Defects],
                    [Customer Code ],
                    [Location],
                    [CutomerName],
                    [KUNUM],
                    [QMNUM],
                    [Responsible_KAM],
                    ROW_NUMBER() OVER(PARTITION BY [Complaint Number] ORDER BY Complaint_For, Defects) AS RowNumber
            FROM    [CCCMPREPOSITORY].[dbo].[VW_Final_]
        ) data
WHERE   RowNumber = 1

Solo necesitaría jugar con el ORDER BY dentro del ROW_NUMBER función para satisfacer sus necesidades.