Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Намерете всички низове, които споделят поне X знака, подредете по подобие

Този подход използва генератор на числа и след това просто тества дължината на припокриването:

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

Това предполага, че information_schema.columns има достатъчно редове за по-дългите имена на лекарства.

Това се присъединява към x към себе си и след това се присъединява към списък с числа. where клаузата проверява три условия:(1) че лявата част на всяко име на лекарството е една и съща до seqnum; (2) че дължината на всяко наименование на лекарството е по-малка или равна на seqnum.

След това агрегирането взема всяка двойка и избира най-високата стойност на seqnum -- това трябва да е най-дългото съвпадение на подниз.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо сравняването на променлива за SQL дата с null се държи по този начин?

  2. Създаване на изгледи само за четене в Sql Server

  3. Как мога да избера първия ден от месеца в SQL?

  4. Обединете няколко реда в един ред

  5. Поддръжката на SQL Server 2008 приключва. Сега какво?