/ / Znajdowanie podobnych nazw w wielu tabelach - sql, sql-server, tsql, sql-like

Znajdowanie podobnych nazw w wielu tabelach - sql, sql-server, tsql, sql-like

Mam wiele tabel z różnymi klientaminazwy. Próbuję dowiedzieć się, ile razy ta sama nazwa jest w tabeli. Wyzwanie polega na tym, że ktoś mógł wpisać nazwisko jako "John Smith" lub "Smith, John".

W każdym stole znajduje się 40 000 wierszy i ponad 40 różnych tabel. Próbuję zapytać w jakiś sposób, nie znając nazwisk, ale wciąż wracam jak imiona.

Zasadniczo muszę grupować jak nazwy bez użycia instrukcji typu:

WHERE cust_name LIKE "%john%"

Jak można zapytać o wiele kolumn tabeli za pomocązawartość innych kolumn tabeli, gdy dane wewnątrz nie mogą mieć tego samego formatu? Jak najlepiej "wyczyścić" dane, aby usunąć przecinki, spacje itp.?

Odpowiedzi:

2 dla odpowiedzi № 1

Będziesz miał logikę rozmytą dostępną w SSIS. Z powodzeniem używam fuzzy grouing, aby znaleźć duplikaty - chociaż będziesz chciał dopasować więcej niż imię, ponieważ wiele osób ma te same imiona. Skonfigurowałem mecz, używając imienia i nazwiska, adresu, telefonu i adresu e-mail. Grupowanie rozmyte pozwala na użycie wielu pól do dopasowania.


1 dla odpowiedzi nr 2

To naprawdę nie jest problem z bazą danych. Prawdziwym problemem jest stworzenie algorytmu, który zajmie nazwę i przekształci go w standardowy format. Jest to trudne i zależy od tego, jak wyglądają twoje dane źródłowe. Przejrzałbym twoje dane źródłowe i spróbuję wymyślić jakieś wzorce, których szukam, a następnie użyję zwykłej manipulacji ciągiem, aby zmienić je wszystkie na ten sam format.


0 dla odpowiedzi № 3

Dopasowywanie nazw może być bardzo trudne. Nie tylko musisz martwić się "John Smith" kontra "Smith, John", ale zazwyczaj musisz się martwić o Katherine vs. Catherine vs. Kate vs. Kathy vs. Cathy. Jestem pewien, że istnieją rozwiązania do eksploracji danych innych firm na coś takiego, choć nie mogę tego polecić.

Jeśli wiesz, że twoje imiona są tylko w formie "FirstName LastName" i "LastName, FirstName", możesz spróbować czegoś takiego:

SELECT
CASE
WHEN name LIKE "%,%"
THEN SUBSTRING(name, CHARINDEX(",", name) + 2, LEN(name)) + " " +
SUBSTRING(name, 1, CHARINDEX(",", name) - 1)
ELSE name
END AS name

Funkcje łańcucha mogą być zależne od twojegookreślony RDBMS. Poza tym jest to dość kruche. Opiera się na dokładnym formacie z spacją po kolumnie itp. Będziesz musiał ją poprawić, jeśli chcesz lepiej.

Proponuję również dodanie widoku naczterdzieści stołów jako UNION ALL, dzięki czemu możesz pracować z nimi wszystkimi naraz. Może zakodować coś w widoku, żeby wiedzieć, z której tabeli pochodzi każdy wiersz.

Na koniec możesz przyjrzeć się używaniu soundex, ale implementacja może być trudna, jeśli nie masz z tym doświadczenia.