Pregunta

He sido entregó una tabla con unos 18000 filas.Cada registro describe la ubicación de un cliente.El problema es, que cuando la persona creada la tabla, no agregar un campo de "Nombre de la Empresa", sólo "Nombre del lugar", y una empresa puede tener muchos lugares.

Por ejemplo, aquí hay algunos registros que describen el mismo cliente:

Ubicación De La Tabla

 ID  Location_Name     
 1   TownShop#1        
 2   Town Shop - Loc 2 
 3   The Town Shop     
 4   TTS - Someplace   
 5   Town Shop,the 3   
 6   Toen Shop4        

Mi objetivo es hacer que se vea como:

Ubicación De La Tabla

 ID  Company_ID   Location_Name     
 1   1            Town Shop#1       
 2   1            Town Shop - Loc 2 
 3   1            The Town Shop     
 4   1            TTS - Someplace   
 5   1            Town Shop,the 3   
 6   1            Toen Shop4        

Tabla De La Compañía

 Company_ID  Company_Name  
 1           The Town Shop 

No hay una "Empresa" de la tabla, voy a tener que generar el Nombre de la Empresa lista de los más descriptivo o mejor Nombre de la Ubicación que representa los múltiples lugares.

Actualmente estoy pensando en que hay que generar una lista de Ubicación de los Nombres que son similares, y luego ir a través de la lista a mano.

Alguna sugerencia sobre cómo puedo enfoque es apreciado.

@"Neall, Gracias por su declaración, pero, por desgracia, cada nombre de la ubicación es distinta, no hay duplicados ubicación nombres, sólo similar.Así, en los resultados de su declaración "repcount" es de 1 en cada fila.

@yukondude, Su paso 4 es el corazón de mi pregunta.

¿Fue útil?

Solución

Por favor, actualice a la pregunta, ¿tiene usted una lista de CompanyNames disponibles para usted?Lo pregunto porque tal vez capaz de utilizar Levenshtein algo para encontrar una relación entre su lista de CompanyNames y LocationNames.


Actualización

No hay una lista de los Nombres de la Compañía, voy a tener que generar el nombre de la empresa de la manera más descriptiva o mejor Nombre de la Ubicación que representa los múltiples lugares.

Bueno...intente esto:

  1. Construir una lista de candidatos que CompanyNames por encontrar LocationNames compuesta en su mayoría o todos los caracteres alfabéticos.Puede utilizar expresiones regulares para esto.Guarde esta lista en una tabla separada.
  2. Ordenar la lista alfabéticamente y (manualmente) determinar que las entradas deben ser CompanyNames.
  3. Comparar cada uno de los CompanyName a cada LocationName y venir para arriba con un partido de puntuación (uso Levenshtein o alguna otra cadena de coincidencia de algo).Almacenar el resultado en una tabla separada.
  4. Establecer un umbral de puntuación tales que cualquier MatchScore < Umbral no será considerado un partido para un determinado CompanyName.
  5. Manual de efp a través de la LocationNames por CompanyName | LocationName | MatchScore, y averiguar cuáles realidad coinciden.Ordenar por MatchScore debe hacer el proceso menos doloroso.

El propósito de estas acciones es automatizar partes y limitar el alcance de su problema.Es lejos de ser perfecto, pero espero que ahorrar la molestia de ir a través de 18K de los registros a mano.

Otros consejos

Yo he tenido que hacer esto antes.La única manera de hacerlo es asignar manualmente las distintas ubicaciones.El uso de la base de datos de la interfaz de la consola y la agrupación de las instrucciones select.En primer lugar, agregue su "Nombre de Compañía" de campo.Entonces:

SELECT count(*) AS repcount, "Location Name" FROM mytable
 WHERE "Company Name" IS NULL
 GROUP BY "Location Name"
 ORDER BY repcount DESC
 LIMIT 5;

Averiguar lo que la empresa para la ubicación en la parte superior de la lista pertenece a y, a continuación, actualizar el campo nombre de la empresa con una ACTUALIZACIÓN ...DONDE "Nombre del lugar" = "La Ubicación" de la declaración.

P. S.- Usted realmente debe romper su empresa nombres y la ubicación de los nombres en tablas separadas y se refieren a ellos por sus claves principales.

Actualización:- Wow - sin duplicados?Cuántos registros tiene usted?

Yo iba a recomendar algunas complicado token algoritmo de coincidencia, pero es realmente difícil de conseguir y si eres de datos no tiene un montón de correlación (errores tipográficos, etc), entonces no va a dar muy buenos resultados.

Yo recomendaría que usted envíe un trabajo a la Amazon Mechanical Turk y dejar que un ser humano algo.

Idealmente, usted probablemente querrá una tabla independiente nombre de la Empresa y, a continuación, un company_id en esta columna el "lugar" en la tabla que es una clave externa para la Empresa clave principal de la tabla, probablemente llamado id.Que se evite un poco justo de texto duplicación en esta tabla (más de 18.000 filas, integer clave foránea podría ahorrar un poco de espacio a través de una columna varchar).

Pero aún se enfrentan con un método para la carga que la Compañía de la tabla y, a continuación, asociar correctamente con las filas en la Ubicación.No hay una solución general, pero se puede hacer algo a lo largo de estas líneas:

  1. Crear la tabla de la Compañía, con una columna de id que se auto-incrementos (depende de su RDBMS).
  2. Encontrar todos los únicos nombres de la compañía y los inserta en la Empresa.
  3. Agregar una columna, company_id, a la posición que acepta valores Null (por ahora) y que es una clave externa de la Empresa.columna de id.
  4. Para cada fila en el lugar, determinar la empresa correspondiente, y ACTUALIZACIÓN de la fila company_id columna con la que la compañía de la id.Esta es, probablemente, el más difícil el paso.Si los datos es como lo que se muestra en el ejemplo, es probable que tengas que tomar muchas pistas en esto con varias cadenas de coincidencia de enfoques.
  5. Una vez que todas las filas en la Ubicación tiene una company_id valor, entonces usted puede MODIFICAR la tabla de la Empresa para agregar una restricción not NULL para el company_id columna (suponiendo que en cada lugar debe tiene una empresa, lo que parece razonable).

Si usted puede hacer una copia de su Ubicación en la tabla, usted puede construir gradualmente una serie de instrucciones SQL para llenar el company_id de clave externa.Si usted comete un error, usted sólo puede empezar de nuevo y vuelva a ejecutar el script hasta el punto de falla.

Sí, que el paso 4 de mi post anterior es un doozy.

No importa qué, usted está probablemente va a tener que hacer algo de esto a mano, pero usted puede ser capaz de automatizar la mayor parte de ella.Para el ejemplo de lugares que usted dio, una consulta como la siguiente sería establecer el adecuado company_id valor:

UPDATE  Location
SET     Company_ID = 1
WHERE   (LOWER(Location_Name) LIKE '%to_n shop%'
OR      LOWER(Location_Name) LIKE '%tts%')
AND     Company_ID IS NULL;

Creo que coincidan con sus ejemplos (he añadido el IS NULL parte para no sobrescribir establecido previamente Company_ID valores), pero, por supuesto, en más de 18.000 filas que va a tener que ser bastante inventiva para manejar las diferentes combinaciones.

Algo que podría ayudar sería el uso de los nombres de la Empresa para generar consultas como la de arriba.Se podría hacer algo como lo siguiente (en MySQL):

SELECT  CONCAT('UPDATE Location SET Company_ID = ',
        Company_ID, ' WHERE LOWER(Location_Name) LIKE ',
        LOWER(REPLACE(Company_Name), ' ', '%'), ' AND Company_ID IS NULL;')
FROM    Company;

A continuación, sólo tiene que ejecutar las instrucciones que se produce.Que podría hacer mucho el grunge trabajo para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top