سؤال

لقد تم تسليمي طاولة بها حوالي 18000 صف.يصف كل سجل موقع عميل واحد.المشكلة هي أنه عندما قام الشخص بإنشاء الجدول، لم يقم بإضافة حقل لـ "اسم الشركة"، بل فقط "اسم الموقع"، ويمكن لشركة واحدة أن تحتوي على العديد من المواقع.

على سبيل المثال، فيما يلي بعض السجلات التي تصف نفس العميل:

جدول الموقع

 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        

هدفي هو جعلها تبدو مثل:

جدول الموقع

 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        

جدول الشركة

 Company_ID  Company_Name  
 1           The Town Shop 

لا يوجد جدول "الشركة"، وسأضطر إلى إنشاء قائمة اسم الشركة من اسم الموقع الأكثر وصفًا أو الأفضل الذي يمثل المواقع المتعددة.

أفكر حاليًا في أنني بحاجة إلى إنشاء قائمة بأسماء المواقع المتشابهة، ثم مراجعة تلك القائمة يدويًا.

أي اقتراحات حول كيفية التعامل مع هذا هو موضع تقدير.

@ نيل، شكرًا لك على بيانك، ولكن لسوء الحظ، كل اسم موقع مميز، ولا توجد أسماء مواقع مكررة، فقط متشابهة.إذن في نتائج بيانك "repcount" هو 1 في كل صف.

@yukondude، خطوتك 4 هي جوهر سؤالي.

هل كانت مفيدة؟

المحلول

يرجى تحديث السؤال، هل لديك قائمة بأسماء الشركات المتاحة لك؟أسأل لأنك ربما تكون قادرًا على استخدام Levenshtein algo للعثور على علاقة بين قائمة أسماء الشركات وأسماء المواقع الخاصة بك.


تحديث

لا توجد قائمة بأسماء الشركات، وسأضطر إلى إنشاء اسم الشركة من اسم الموقع الأكثر وصفًا أو الأفضل الذي يمثل المواقع المتعددة.

تمام...جرب هذا:

  1. أنشئ قائمة بأسماء الشركات المرشحة من خلال البحث عن LocationNames التي تتكون في معظمها أو كلها من أحرف أبجدية.يمكنك استخدام التعبيرات العادية لهذا.قم بتخزين هذه القائمة في جدول منفصل.
  2. قم بفرز تلك القائمة أبجديًا و(يدويًا) حدد الإدخالات التي يجب أن تكون CompanyNames.
  3. قارن كل اسم شركة بكل اسم موقع وتوصل إلى نتيجة مطابقة (استخدم ليفنشتاين أو بعض الخوارزميات المطابقة للسلسلة الأخرى).قم بتخزين النتيجة في جدول منفصل.
  4. قم بتعيين درجة الحد بحيث لا يتم اعتبار أي نتيجة مطابقة <العتبة مطابقة لاسم شركة معين.
  5. Vet يدويًا من خلال أسماء الموقع بواسطة CompanyName | الموقع | MatchScore ، ومعرفة أي منها يتطابق بالفعل.الطلب عن طريق MatchScore يجب أن يجعل العملية أقل إيلامًا.

الغرض الكامل من الإجراءات المذكورة أعلاه هو أتمتة الأجزاء والحد من نطاق مشكلتك.إنه أبعد ما يكون عن الكمال، ولكن نأمل أن يوفر عليك عناء مراجعة 18 ألف سجل يدويًا.

نصائح أخرى

لقد كان علي أن أفعل هذا من قبل.الطريقة الحقيقية الوحيدة للقيام بذلك هي مطابقة المواقع المختلفة يدويًا.استخدم واجهة وحدة التحكم الخاصة بقاعدة البيانات الخاصة بك وقم بتجميع عبارات التحديد.أولاً، قم بإضافة حقل "اسم الشركة" الخاص بك.ثم:

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

اكتشف الشركة التي ينتمي إليها الموقع الموجود في أعلى القائمة، ثم قم بتحديث حقل اسم شركتك بـ UPDATE...حيث "اسم الموقع" = عبارة "الموقع".

ملاحظة.- يجب عليك تقسيم أسماء شركتك وأسماء مواقعك إلى جداول منفصلة والإشارة إليها بمفاتيحها الأساسية.

تحديث:- واو - لا التكرارات؟كم عدد السجلات لديك؟

كنت سأوصي ببعض الخوارزميات المعقدة لمطابقة الرموز المميزة ولكن من الصعب جدًا الحصول عليها بشكل صحيح وإذا كانت بياناتك لا تحتوي على الكثير من الارتباط (الأخطاء المطبعية، وما إلى ذلك) فلن تعطي نتائج جيدة جدًا.

أنصحك بتقديم وظيفة إلى الأمازون الميكانيكية التركية ودع الإنسان يفرزها.

من الناحية المثالية، ربما تريد جدولاً منفصلاً باسم "الشركة" ثم عمود "معرف_الشركة" في جدول "الموقع" هذا والذي يمثل مفتاحًا خارجيًا للمفتاح الأساسي لجدول الشركة، ومن المحتمل أن يسمى "المعرف".سيؤدي ذلك إلى تجنب قدر لا بأس به من تكرار النص في هذا الجدول (أكثر من 18000 صف، سيوفر المفتاح الخارجي الصحيح قدرًا كبيرًا من المساحة على عمود varchar).

ولكنك لا تزال تواجه طريقة لتحميل جدول الشركة ثم ربطه بشكل صحيح بالصفوف الموجودة في الموقع.لا يوجد حل عام، ولكن يمكنك القيام بشيء على هذا المنوال:

  1. أنشئ جدول الشركة، بعمود معرف يتزايد تلقائيًا (يعتمد على نظام إدارة قواعد البيانات RDBMS الخاص بك).
  2. ابحث عن جميع أسماء الشركات الفريدة وأدخلها في الشركة.
  3. أضف عمودًا، Company_id، إلى الموقع الذي يقبل القيم الخالية (في الوقت الحالي) وهو مفتاح خارجي لعمود Company.id.
  4. بالنسبة لكل صف في الموقع، حدد الشركة المقابلة، وقم بتحديث عمود معرف الشركة الخاص بهذا الصف بمعرف تلك الشركة.من المحتمل أن تكون هذه هي الخطوة الأكثر تحديًا.إذا كانت بياناتك مثل ما تظهره في المثال، فمن المحتمل أن تضطر إلى القيام بالعديد من عمليات التشغيل باستخدام أساليب مطابقة السلسلة المختلفة.
  5. بمجرد أن تحتوي جميع الصفوف في الموقع على قيمة معرف الشركة، يمكنك تغيير جدول الشركة لإضافة قيد NOT NULL إلى عمود معرف الشركة (على افتراض أن كل موقع يجب لديك شركة، والتي تبدو معقولة).

إذا كان بإمكانك إنشاء نسخة من جدول الموقع الخاص بك، فيمكنك إنشاء سلسلة من عبارات SQL تدريجيًا لملء المفتاح الخارجي الخاص بالشركة.إذا قمت بخطأ ما، يمكنك فقط البدء من جديد وإعادة تشغيل البرنامج النصي حتى نقطة الفشل.

نعم، هذه الخطوة 4 من رسالتي السابقة هي doozy.

بغض النظر عن أي شيء، ربما سيتعين عليك القيام ببعض هذا يدويًا، ولكن قد تتمكن من أتمتة الجزء الأكبر منه.بالنسبة لأمثلة المواقع التي قدمتها، سيؤدي استعلام مثل ما يلي إلى تعيين قيمة Company_id المناسبة:

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;

أعتقد أن هذا سيطابق الأمثلة الخاصة بك (أضفت ملف IS NULL جزء لعدم الكتابة فوق قيم Company_ID التي تم تعيينها مسبقًا)، ولكن بالطبع في 18000 صف، سيتعين عليك أن تكون مبتكرًا جدًا للتعامل مع المجموعات المختلفة.

هناك شيء آخر قد يساعد وهو استخدام الأسماء الموجودة في الشركة لإنشاء استعلامات مثل تلك المذكورة أعلاه.يمكنك القيام بشيء مثل ما يلي (في 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;

ثم قم فقط بتشغيل البيانات التي تنتجها.يمكن أن يؤدي ذلك إلى الكثير من أعمال الجرونج نيابةً عنك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top