sql >> Base de Datos >  >> RDS >> Sqlserver

Encuentre todas las cadenas que comparten al menos X caracteres, ordene por similitud

Este enfoque utiliza un generador de números y luego solo prueba la longitud de la superposición:

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

Esto supone que information_schema.columns tiene suficientes filas para los nombres de medicamentos más largos.

Esto une x a sí mismo y luego se une a una lista de números. El where la cláusula verifica tres condiciones:(1) que la parte izquierda de cada nombre de medicamento sea el mismo hasta el seqnum; (2) que la longitud de cada nombre de medicamento sea menor o igual a seqnum.

Luego, la agregación toma cada par y elige el valor más alto de seqnum; esta debería ser la coincidencia de subcadena más larga.