sql >> Database >  >> RDS >> Sqlserver

Zoek alle tekenreeksen die ten minste X tekens delen, sorteer op gelijkenis

Deze aanpak maakt gebruik van een nummergenerator en test dan alleen de lengte van de overlap:

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

Dit veronderstelt dat information_schema.columns heeft genoeg rijen voor de langere medicijnnamen.

Dit voegt zich bij x zichzelf en voegt zich vervolgens in een lijst met nummers. De where clausule controleert drie voorwaarden:(1) dat het linkerdeel van elke medicijnnaam hetzelfde is tot aan het volgende; (2) dat de lengte van elke medicijnnaam kleiner is dan of gelijk is aan seqnum.

De aggregatie neemt vervolgens elk paar en kiest de hoogste waarde van seqnum -- dit zou de langste substring-overeenkomst moeten zijn.



  1. libaio.so.1:kan het gedeelde objectbestand niet openen

  2. MySQL InnoDB Cluster 8.0 - Een complete operatie walk-through:deel twee

  3. SQL multiple SELECT-query met xmlagg-functie - Gegevens niet op de vereiste manier opgehaald

  4. Django en PostgreSQL instellen op twee verschillende EC2-instanties