Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Encontre todas as strings que compartilham pelo menos X caracteres, ordene por semelhança


Essa abordagem usa um gerador de números e, em seguida, apenas testa o comprimento da sobreposição:
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

Isso pressupõe que information_schema.columns tem linhas suficientes para os nomes de medicamentos mais longos.

Isso une x para si mesmo e, em seguida, junta-se a uma lista de números. O where cláusula está verificando três condições:(1) que a parte esquerda de cada nome do medicamento seja a mesma até o seqnum; (2) que o comprimento de cada nome de droga é menor ou igual a seqnum.

A agregação então pega cada par e escolhe o valor mais alto de seqnum -- esta deve ser a correspondência de substring mais longa.