Рассчитать процент соответствия слова - PullRequest
0 голосов
/ 15 ноября 2018
CREATE TABLE tbl_pat
(
    id int,
    name varchar(100),
    [address] varchar(500)
);
INSERT INTO tbl_pat VALUES(1,'Jack','Lane 1, 90 Road Street, SL');
INSERT INTO tbl_pat VALUES(2,'Will','SA, Lane 10, Street road');
INSERT INTO tbl_pat VALUES(3,'White','Lane 1 ZIM');
INSERT INTO tbl_pat VALUES(4,'Shaw','Street Road');
INSERT INTO tbl_pat VALUES(5,'Steve','Road Street');
INSERT INTO tbl_pat VALUES(6,'Brown','Nz Road 10');

Ожидаемый результат:

Строка поиска: Street Road

Name    Address                     Percentage
---------------------------------------------
Shaw    Street Road                 100
Steve   Road Street                 100
Will    SA, Lane 10, Street road    20
Jack    Lane 1, 90 Road Street, SL  17

Примечание. Процент указан в предположении, но первые два должны составлять 100%это имеет точное совпадение.

Я использую PATINDEX для поиска слова.

Запрос: Поиск Уличная дорога

SELECT [Name],[Address] 
FROM tbl_pat 
WHERE PATINDEX('%Street%',[Address])>=1 AND PATINDEX('%Road%',[Address])>=1 

Как рассчитать процент соответствияслово в единственном операторе выбора?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Я думаю, что есть проблема с расчетом в процентах, который вы предоставили Например, Джек, имеет совпадение 2 и выводит 6 слов. Поэтому я ожидаю, что его результат будет% 33

Пожалуйста, проверьте следующий запрос SQL, где я использовал функцию String_Split , чтобы разбить текст на слова

declare @str nvarchar(max) = 'Road Street'

; with tbl as (
select *, count(*) over (partition by id) word_count
from tbl_pat t
cross apply STRING_SPLIT(replace(t.address,',',' '), ' ')
where trim([value]) <> ''  
)
select distinct id, [name], word_count, count(search.[value]) over (partition by id),
    convert( decimal(5,2), (100.0 * (count(search.[value]) over (partition by id)) / word_count))
from tbl 
left join (
    select * from STRING_SPLIT(@str, ' ')
) search
    on search.[value] = tbl.[value]
order by id

вывод

enter image description here

0 голосов
/ 15 ноября 2018

здесь я использую string_split() из SQL Server 2017. Вы можете заменить любой доступной функцией разделения строк. Просто сделайте поиск

Это не идеально, но работает для вашего образца.

select  p.id, p.name, p.address, count(k.value) * 100.0 / count(*) as pecentage
from    tbl_pat p
        cross apply string_split(replace([address], ',', ' '), ' ') w
        left join
        (
            select  value
            from    string_split ('Road Street', ' ') 
        ) k on  w.value     = k.value
group by p.id, p.name, p.address
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...