Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Znajdź wszystkie ciągi, które mają co najmniej X znaków, uporządkuj według podobieństwa

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rozwiązywanie problemów z przyznawaniem pamięci zmiennej w programie SQL Server

  2. Klucz podstawowy SQL może akceptować „0”?

  3. Jak skopiować rekord w tabeli SQL, ale zamienić unikalny identyfikator nowego wiersza?

  4. Mapowanie kluczy złożonych przy użyciu kodu EF w pierwszej kolejności

  5. Wyraźne losowe generowanie czasu w ustalonym interwale