registros quitar mostrar evitar eliminar duplicados sql-server ssis duplicates business-intelligence duplicate-removal

sql-server - quitar - no mostrar registros duplicados sql server



¿Cómo eliminar filas duplicadas del archivo plano utilizando SSIS? (9)

La estrategia generalmente dependerá de cuántas columnas tenga la tabla de etapas. Cuantas más columnas, más compleja es la solución. El artículo que vinculó tiene algunos consejos muy buenos.

Lo único que añadiré a lo que todos los demás han dicho hasta ahora es que las columnas con valores de fecha y fecha y hora le darán cabida a algunas de las soluciones presentadas aquí.

Una solución que se me ocurrió es esta:

SET NOCOUNT ON DECLARE @email varchar(100) SET @email = '''' SET @emailid = (SELECT min(email) from StagingTable WITH (NOLOCK) WHERE email > @email) WHILE @emailid IS NOT NULL BEGIN -- Do INSERT statement based on the email INSERT StagingTable2 (Email) FROM StagingTable WITH (NOLOCK) WHERE email = @email SET @emailid = (SELECT min(email) from StagingTable WITH (NOLOCK) WHERE email > @email) END

Esto es MUCHO más rápido cuando se realiza la deduplicación, que un CURSOR y no enlaza la CPU del servidor. Para usar esto, separe cada columna que proviene del archivo de texto en sus propias variables. Use una instrucción SELECT por separado antes y dentro del ciclo, luego inclúyalos en la instrucción INSERT. Esto funcionó muy bien para mí.

Permítanme decir primero que poder tomar 17 millones de registros de un archivo plano, empujar a un DB en una caja remota y tenerlo en 7 minutos es increíble. SSIS es realmente fantástico. Pero ahora que tengo esos datos allí, ¿cómo elimino los duplicados?

Mejor aún, quiero tomar el archivo plano, eliminar los duplicados del archivo plano y volver a ponerlos en otro archivo plano.

Estoy pensando en un:

Data Flow Task

  • Fuente de archivo (con una conexión de archivo asociada)
  • Un contenedor para bucle
  • Un contenedor de script que contiene cierta lógica para saber si existe otra fila

Thak usted, y todos en este sitio es increíblemente bien informado.

Update: he encontrado este enlace, podría ayudar a responder esta pregunta


Sugeriría usar SSIS para copiar los registros en una tabla temporal, luego crearía una tarea que use Seleccionar Distinct o Rank dependiendo de su situación para seleccionar los duplicados que los canalizarían a un archivo plano y los eliminarían de la tabla temporal. El último paso sería copiar los registros de la tabla temporal en la tabla de destino.

Determinar un duplicado es algo en lo que SQL es bueno, pero un archivo plano no es tan adecuado. En el caso que usted propuso, el contenedor de script cargaría una fila y luego tendría que compararla con 17 millones de registros, luego cargaría la siguiente fila y repetiría ... El rendimiento podría no ser tan bueno.


Para hacer esto en el archivo plano, uso la herramienta de línea de comandos de Unix, ordenar:

sort -u inputfile > outputfile

Desafortunadamente, el comando de ordenación de Windows no tiene una opción única, pero puede intentar descargar una utilidad de ordenamiento de uno de estos:

(No los he probado, entonces no hay garantías, me temo).

Por otro lado, para hacer esto a medida que los registros se cargan en la base de datos, puede crear un índice único en la clave de la tabla de la base de datos con ignore_dup_key. Esto hará que los registros sean únicos de manera muy eficiente en el momento de la carga.

CREATE UNIQUE INDEX idx1 ON TABLE (col1, col2, ...) WITH IGNORE_DUP_KEY


Un poco de una solución sucia es establecer su tabla de destino con una clave compuesta que abarca todas las columnas. Esto garantizará la singularidad distint. Luego, en la forma de Destino de datos, configure la tarea para ignorar los errores. Todos los insertos duplicados caerán en el olvido.


Fuente de archivo plano -> Agregado (Agrupe por columnas que desee único) -> Destino de archivo plano


El texto del enlace encontrado en esta página puede valer la pena mirarlo, aunque con 17 millones de registros podría tomar un poco más de tiempo


Recomiendo cargar una tabla de etapas en el servidor de destino y luego combinar los resultados en una tabla de destino en el servidor de destino. Si necesita ejecutar alguna regla de higiene, puede hacerlo a través de un procedimiento almacenado, ya que obtendrá un mejor rendimiento que a través de las tareas de transformación de flujo de datos de SSIS. Además, la deduping es generalmente un proceso de varios pasos. Es posible que desee deducer en:

  1. Distintas líneas
  2. Distintos grupos de columnas como Nombre, Apellido, Dirección de correo electrónico, etc.
  3. Es posible que desee deducir contra una tabla objetivo existente. Si ese es el caso, entonces es posible que deba incluir declaraciones NOT EXISTS o NOT IN. O quizás desee actualizar la fila original con nuevos valores. Por lo general, esto se realiza mejor con una instrucción MERGE y una subconsulta para la fuente.
  4. Tome la primera o la última fila de un patrón en particular. Por ejemplo, puede querer que la última fila ingresada en el archivo aparezca cada vez que aparezca una dirección de correo electrónico o un número de teléfono. Por lo general, confío en CTE con ROW_NUMBER () para generar orden secuencial y columnas de orden inverso como en la muestra siguiente:

.

WITH sample_records ( email_address , entry_date , row_identifier ) AS ( SELECT ''[email protected]'' , ''2009-10-08 10:00:00'' , 1 UNION ALL SELECT ''[email protected]'' , ''2009-10-08 10:00:01'' , 2 UNION ALL SELECT ''[email protected]'' , ''2009-10-08 10:00:02'' , 3 UNION ALL SELECT ''[email protected]'' , ''2009-10-08 10:00:00'' , 4 UNION ALL SELECT ''[email protected]'' , ''2009-10-08 10:00:00'' , 5 ) , filter_records ( email_address , entry_date , row_identifier , sequential_order , reverse_order ) AS ( SELECT email_address , entry_date , row_identifier , ''sequential_order'' = ROW_NUMBER() OVER ( PARTITION BY email_address ORDER BY row_identifier ASC) , ''reverse_order'' = ROW_NUMBER() OVER ( PARTITION BY email_address ORDER BY row_identifier DESC) FROM sample_records ) SELECT email_address , entry_date , row_identifier FROM filter_records WHERE reverse_order = 1 ORDER BY email_address;

Hay muchas opciones para usted en la deduplicación de archivos, pero en última instancia, recomiendo manejar esto en un procedimiento almacenado una vez que haya cargado una tabla de etapas en el servidor de destino. Después de limpiar los datos, puede fusionar o INSERTAR en su destino final.


Use el Componente Sort.

Simplemente elija en qué campos desea ordenar las filas cargadas y en la esquina inferior izquierda verá una casilla de verificación para eliminar duplicados. Este recuadro elimina las filas que son duplicadas según los criterios de clasificación, por lo que en el ejemplo siguiente, las filas se considerarán duplicadas si solo seleccionamos el primer campo:

1 | sample A | 1 | sample B |


Podemos usar tablas de búsqueda para esto. Al igual que SSIS proporciona dos DFS (Transformaciones de flujo de datos), es decir, agrupamiento difuso y búsqueda difusa.