sql >> Databáze >  >> RDS >> Sqlserver

Najděte všechny řetězce, které sdílejí alespoň X znaků, seřaďte je podle podobnosti

Tento přístup používá generátor čísel a poté pouze testuje délku překrytí:

select x.drug_name, x2.drug_name, MAX(c.seqnum) as OverlapLen
from x cross join
     x x2 cross join
     (select ROW_NUMBER() over (order by (select NULL)) seqnum
      from INFORMATION_SCHEMA.COLUMNS c
     ) c
where LEFT(x.drug_name, c.seqnum) = LEFT(x2.drug_name, c.seqnum) and
      len(x.drug_name) >= c.seqnum and len(x2.drug_name) >= c.seqnum
group by x.drug_name, x.drug_name
order by x.drug_name, OverlapLen desc

To předpokládá, že information_schema.columns má dostatek řádků pro delší názvy léků.

Tím se spojí x k sobě a poté se připojí k seznamu čísel. where klauzule kontroluje tři podmínky:(1) že levá část názvu každého léku je stejná až do seqnum; (2) že délka každého názvu léku je menší nebo rovna seqnum.

Agregace pak vezme každý pár a vybere nejvyšší hodnotu seqnum – to by měla být nejdelší shoda podřetězců.



  1. Jak funguje funkce LCASE() v MySQL

  2. Najděte záznamy z jedné tabulky, které v jiné neexistují

  3. mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows atd... očekává, že parametr 1 bude zdrojem

  4. MySQL TINYINT jako nepodepsaný