Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Finden Sie alle Zeichenfolgen, die mindestens X Zeichen gemeinsam haben, sortiert nach Ähnlichkeit

Dieser Ansatz verwendet einen Zahlengenerator und testet dann einfach die Länge der Überlappung:

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

Dies setzt voraus, dass information_schema.columns hat genug Zeilen für die längeren Medikamentennamen.

Dies verbindet x zu sich selbst und fügt sich dann in eine Liste von Nummern ein. Das where Klausel prüft drei Bedingungen:(1) dass der linke Teil jedes Arzneimittelnamens bis zur Seqnum gleich ist; (2) dass die Länge jedes Arzneimittelnamens kleiner oder gleich Seqnum ist.

Die Aggregation nimmt dann jedes Paar und wählt den höchsten Wert von seqnum – dies sollte die längste Teilstring-Übereinstimmung sein.