sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta alla strängar som delar minst X tecken, ordna efter likhet

Detta tillvägagångssätt använder en nummergenerator och testar sedan bara längden på överlappningen:

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

Detta förutsätter att information_schema.columns har tillräckligt med rader för de längre läkemedelsnamnen.

Detta ansluter till x till sig själv och går sedan med i en lista med nummer. var klausulen kontrollerar tre villkor:(1) att den vänstra delen av varje läkemedelsnamn är densamma upp till sekvensnumret; (2) att längden på varje läkemedelsnamn är mindre än eller lika med sekvensnumret.

Aggregeringen tar sedan varje par och väljer det högsta värdet av sekvensnummer -- detta bör vara den längsta delsträngsmatchningen.



  1. Är det möjligt att ange villkor i Count()?

  2. Misslyckades med att ansluta AWS-Postgres-server med fjäderstartapplikation med heroku-hosting

  3. "Många till två" relation

  4. MySQL gruppera efter datum och konvertera från unix tidsstämpel