Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-列中的相似数据_Sql_Sql Server - Fatal编程技术网

SQL-列中的相似数据

SQL-列中的相似数据,sql,sql-server,Sql,Sql Server,是否有任何方法可以在列中找到类似的结果。例如: 我希望从没有4棵绿色树的表数据中查询返回,因为并没有类似于绿色树的数据,但蓝色汽车类似于蓝色汽车,红色娃娃类似于红色娃娃 如何做到这一点 我使用microsoft sql server Management studio正如Gar正确评论的那样,您必须定义“相似性”的含义。 但是,如果您只需要一些固定的相等字符数(在您的示例中为8),则可以执行以下操作: create table myTest ( id int, name va

是否有任何方法可以在列中找到类似的结果。例如:

我希望从没有4棵绿色树的表数据中查询返回,因为并没有类似于绿色树的数据,但蓝色汽车类似于蓝色汽车,红色娃娃类似于红色娃娃

如何做到这一点


我使用microsoft sql server Management studio

正如Gar正确评论的那样,您必须定义“相似性”的含义。 但是,如果您只需要一些固定的相等字符数(在您的示例中为8),则可以执行以下操作:

create table myTest
(
    id int,
    name varchar(20)
);

insert into myTest values(1, 'blue car');
insert into myTest values(2, 'red doll');
insert into myTest values(3, 'blue cars');
insert into myTest values(4, 'green tree');
insert into myTest values(5, 'red dolly');

select left(name,8), count(*) 
from myTest 
group by left(name,8) 
having count(*) > 1;

您可以使用
SOUNDEX
来执行此操作

样本数据

CREATE TABLE #SampleData (Column1 int, Column2 varchar(10))
INSERT INTO #SampleData (Column1, Column2)
VALUES
(1,'blue car')
,(2,'red doll')
,(3,'blue cars')
,(4,'green tree')
,(5,'red dolly')
以下代码将使用
soundex
column2
中创建类似条目的列表。然后使用不同的子查询查看该
soundex
字段出现的次数

SELECT
a.GroupingField
,a.Title
,b.SimilarFields
FROM (
        SELECT
        SOUNDEX(Column2) GroupingField
        ,MAX(Column2) Title --Just return a unique title for this soundex group
        FROM #SampleData
        GROUP BY SOUNDEX(Column2)
      ) a
LEFT JOIN   (
                SELECT
                SOUNDEX(Column2) GroupingField
                ,COUNT(Column2) SimilarFields --How many fields are in the soundex group?
                FROM #SampleData
                GROUP BY SOUNDEX(Column2)
            ) b
ON a.GroupingField = b.GroupingField
WHERE b.SimilarFields > 1
结果如下所示(我将
soundex
字段保留在中,以显示它的外观)

进一步阅读
soundex

编辑:根据您的请求,为了获得原始数据,您可以将其推送到临时表中,将我提供给您的查询更改为在
FROM
语句的
之前放入

SELECT
a.GroupingField
,a.Title
,b.SimilarFields
INTO #Duplicates
FROM (
        SELECT
        SOUNDEX(Column2) GroupingField
        ,MAX(Column2) Title --Just return a unique title for this soundex group
        FROM #SampleData
        GROUP BY SOUNDEX(Column2)
      ) a
LEFT JOIN   (
                SELECT
                SOUNDEX(Column2) GroupingField
                ,COUNT(Column2) SimilarFields --How many fields are in the soundex group?
                FROM #SampleData
                GROUP BY SOUNDEX(Column2)
            ) b
ON a.GroupingField = b.GroupingField
WHERE b.SimilarFields > 1
然后使用以下查询链接回原始数据

SELECT
a.GroupingField
,a.Title
,a.SimilarFields
,b.Column1
,b.Column2
FROM #Duplicates a
JOIN #SampleData b
ON a.GroupingField = SOUNDEX(b.Column2)
ORDER BY a.GroupingField
将给出以下结果

GroupingField   Title       SimilarFields   Column1     Column2
B400            blue cars   2               1           blue car
B400            blue cars   2               3           blue cars
R300            red dolly   2               5           red dolly
R300            red dolly   2               2           red doll
记住

DROP TABLE #Differences

这种方法使用了非常基本的相似性概念,但可以扩展到更好的定义。请注意,这不是很有效。
计数(1)+1
包括基本短语

create table phrases ( phrase varchar(max) )
insert phrases values( 'blue car' ), ( 'blue cars' ), ('green tree' ), ( 'red doll' ), ( 'red dolly' )

create function dbo.fnSimilar( @s1 varchar(max), @s2 varchar(max) )
returns int
begin
    if @s1 = @s2 return 0 -- a phrase is not similar to itself
    if @s1 like @s2 + '%' return 1
    if @s2 like @s1 + '%' return 2
    return 0
end

select x.phrase, similar = count(1) + 1 from 
(
    select p1.phrase from phrases p1
    inner join phrases p2 on dbo.fnSimilar( p2.phrase, p1.phrase ) = 1
) x
group by x.phrase
结果:

phrase      similar
--------    -------
blue car    2
red doll    2

你必须定义什么是“相似性”,是levenstein距离吗?还是soundex?我认为你的目标是更简单的方法,比如前三个字母组相等?谢谢,就是这样。我只有一个问题。如何修改代码以查看分组中包含哪些数据,要查看蓝色汽车2、蓝色汽车2、红色玩偶2、红色玩偶2,您可以将此查询包含在外部查询中,也可以将查询结果推送到临时表中,然后基于soundex链接回原始数据。如果答案符合您的需要,请随时向上投票并将答案标记为已接受。好的,我已将完整的查询粘贴到。在编辑后使用代码。注意,您必须匹配您的数据(我的称为#SampleData,您的将不同)。如果要多次运行此操作,您还必须在代码末尾删除表差异
phrase      similar
--------    -------
blue car    2
red doll    2