NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Martin Císař:21.4.2017 8:27

Ahoj,

měl bych prosbu.
Mám databázi, jedná se o MySQL, kde jsou evidované účty zákazníků. Jednoznačným identifikátorem je id. Je zde sloupec name, ve kterém bych potřeboval odstranit duplicity a zkontrolovat účty s podobným názvem. Select na duplicitu účtu jsem si vytvořil, problém je s kontrolou účtu s podobným názvem.
Příklady toho, jak mohou v databázi vypadat účty, které potřebuji zkontrolovat:
ABF a.s / ABF, a.s.
"ABCD s.r.o" / ABCD s.r.o.
REWAQ a.s. / REWAQ v.o.s.
>rozdíly jsou tučně zvýrazněné.
Tabulka má kolem 150 000 záznamů.
Je možné vytvořit jeden SELECT, který by mi vrátil všechny podobné záznamy, abych to mohl zkontrolovat?

Moc děkuju za každou pomoc,

Martin

 
Odpovědět
21.4.2017 8:27
Avatar
Odpovídá na Martin Císař
Michal Štěpánek:21.4.2017 9:12

Tohle jednoduše asi nepůjde. Nemáš v té tabulce ještě nějaké záznamy, jako třeba IČO apod., podle kterých by se daly ty podobnosti najít?

Nahoru Odpovědět
21.4.2017 9:12
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Martin Císař:21.4.2017 9:23

Právě že jednoznačný identifikátor v tabulce je jen id. Dále jsou tam pouze pomocné záznamy jako: kdo účet vytvořil, datum vytvoření účtu, ulice, ... Ale všechno to jsou nepovinné parametry, takže např. kontrolovat podle ulice by to šlo, ale obávám se, že mi z toho nevyplavou všechny záznamy.
IČO je v jiné tabulce (tu jsem také kvůli duplicitám IČO procházel), problém je, že to byl opět nepovinný údaj, takže spousta účtů IČO nemá.

 
Nahoru Odpovědět
21.4.2017 9:23
Avatar
Odpovídá na Martin Císař
Michal Štěpánek:21.4.2017 9:49

Mám obavy, že ti nezbyde nic jiného, než to seřadit podle názvu firmy a projít ručně...

Nahoru Odpovědět
21.4.2017 9:49
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin Císař:21.4.2017 10:31

Do toho se mi právě nechtělo :D
Ale asi nic jiného nakonec nezbude.
Stejně díky

 
Nahoru Odpovědět
21.4.2017 10:31
Avatar
Robert Poč
Člen
Avatar
Robert Poč:21.4.2017 11:45

A co třeba takto:

SELECT
empl.id,
(
        SELECT
                dupl.id
        FROM empl as dupl
        WHERE
                dupl.nazev LIKE LEFT(empl.nazev, 3) + '%'       AND
                dupl.id <> empl.id
        FOR XML RAW ('dupliciCompanyId'), ROOT('companies'), ELEMENTS
) AS duplicitniIDs
FROM
empl

vhodnou úpravou sekce

dupl.nazev LIKE LEFT(empl.nazev, 3) + '%'

lze pokrýt odhadem tak 97% duplicit, případně si nad sloupcem s názvem zapni fulttext, pokud to ta DB umí a nech si vyhledat shody ke všem záznamům.
Zbytek brigádník, ale za podstatně kratší čas.

 
Nahoru Odpovědět
21.4.2017 11:45
Avatar
Odpovídá na Robert Poč
Martin Císař:21.4.2017 12:19

Hale paráda, moc děkuju, určitě vyzkoušim.
Brigádníka nemám, takže ho budu muset suplovat já sám.
Ale pohoda, určitě to hodně pomůže.
Ještě jednou díky

 
Nahoru Odpovědět
21.4.2017 12:19
Avatar
Odpovídá na Robert Poč
Martin Císař:21.4.2017 13:34

V tomto případě je problém ten, že nevím jestli že DB umí to:
FOR XML RAW ('dupliciCompa­nyId'), ROOT('companies'), ELEMENTS. (hazí mi to chybu viz obrázek)
A když to zakomentuju, tak hláší, že subselect vrací víc jak jednu hodnotu.

 
Nahoru Odpovědět
21.4.2017 13:34
Avatar
Robert Poč
Člen
Avatar
Robert Poč:21.4.2017 13:46

To je pravděpodobné, že vrací více hodnot. Sample je pro MSSQL, který vrací XML, zkus si pro svoji DB najit něco jako "convert multiple columns to one column", abysi měl hodnoty v jedné buňce oddělěné třeba středníkem.

 
Nahoru Odpovědět
21.4.2017 13:46
Avatar
plelovsky
Člen
Avatar
plelovsky:24.4.2017 14:03

Napiš si funkci, která má jako vstup sloupec 'name'. Funkce normalizuje název firmy, tj.

  1. odstraní mezery
  2. převede všechna písmena na malá
  3. odstraní interpunkci, tj. převede znaky á->a, č->c atd.
  4. odstraní řetězce "s.r.o.", "spol.sr.o.", "a.s.", "v.o.s.", případně další zkratky právních forem
  5. ponechá pouze písmena a číslice, tj. odstraní interpunkční znaky

Select z tabulky potom zgrupuješ podle výstupu této funkce a vyhodnotíš duplicity pomocí HAVING COUNT(*) > 1

 
Nahoru Odpovědět
24.4.2017 14:03
Avatar
plelovsky
Člen
Avatar
Odpovídá na plelovsky
plelovsky:24.4.2017 14:05

Ad bod 3 - odstraní diakritiku

 
Nahoru Odpovědět
24.4.2017 14:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.