To podejście wykorzystuje generator liczb, a następnie testuje długość nakładania się:
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
Zakłada się, że information_schema.columns
ma wystarczająco dużo wierszy na dłuższe nazwy leków.
To łączy x
do siebie, a następnie dołącza do listy liczb. where
klauzula sprawdza trzy warunki:(1) czy lewa część nazwy każdego leku jest taka sama aż do numeru; (2) długość każdej nazwy leku jest mniejsza lub równa numerowi kolejnemu.
Agregacja następnie pobiera każdą parę i wybiera najwyższą wartość numeru sekwencyjnego -- powinno to być najdłuższe dopasowanie podciągu.