【问题标题】:Calculate percentage of matching word计算匹配词的百分比
【发布时间】:2018-11-15 08:17:21
【问题描述】:
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 

如何计算单个select语句中匹配词的百分比?

【问题讨论】:

  • 这个百分比的计算公式是什么?
  • 如果没有进行完整的正则表达式搜索的能力,这将很难准确地做到。

标签: sql-server sql-server-2008-r2


【解决方案1】:

我认为您提供的预期百分比计算存在问题 例如 Jack,有一个匹配 2 output 6 words 。所以我希望它的结果是 %33

请测试我使用String_Split function 将文本拆分为单词的以下 SQL 查询

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

输出是

【讨论】:

    【解决方案2】:

    我在这里使用来自SQL Server 2017string_split()。您可以替换为任何可用的字符串拆分功能。随便搜一下

    它并不完美,但它适用于您的示例。

    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
    

    【讨论】:

    • 嗨@Squirrel,如果您添加过滤条件“ where w.value ''” 以删除拆分功能的空白返回,它将产生正确的结果
    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多