sql - PostgreSQL多pg_trgm相似度评分子查询

标签 sql postgresql similarity

我是 SQL 的新手,我正在努力处理子查询。我有一张看起来像这样的表:

      sss        | mm | sid 
------------------+----+-----
IBM LTD          |    | 003
I.B.M.           |    | 003
A.BM LTD         |    | 004
IMB LTD          |    | 004
IMB UK           |    | 005
IBMUK LTD        |    | 006
IBMUKLTD         |    | 007
IBM LIMITED      |    | 008
IBM U.K.         |    | 008
IBM U.K. LIMITED |    | 009
I.B.M UK LTD     | 1  | 001
IBM              | 1  | 001
IBM UK           | 1  | 001
IBM UK LTD       | 1  | 001

mm 列中带有1 的行是手动匹配的行,ID 是正确的。我想使用 similarity 函数尝试找到与已手动匹配的记录的接近匹配项。

我知道通常你会在 from 语句中放置一个子查询,但我不能用 similarity 函数来做,但我不知道该怎么做,这就是我想这样做:

SELECT 
    sss, 
    similarity(sss, select(sss from tusm where mm = 1) as match_score)
from 
    tusm 
where 
    mm is null and
    where match_score >= 0.5
;

最佳答案

你在这里遇到了一些问题。您不能在 where 子句中使用列别名,您试图在括号的错误一侧分配列别名,您不能将集合提供给 similarity 的第二个参数,并且您通常只是在几个地方破坏了语法。

为了克服similarity无法处理集合的问题,做一个自连接:

select a.sss as a_sss, b.sss as b_sss, similarity(a.sss, b.sss) as score from
tusm a, tusm b 
where a.mm is null and b.mm = 1 and 
similarity(a.sss, b.sss)  > 0.5;

给予

   a_sss   |   b_sss    |  score
-----------+------------+----------
 IBM LTD   | IBM UK LTD | 0.727273
 IBMUK LTD | IBM UK LTD | 0.615385

如果表变大,将很难使其表现良好。

关于sql - PostgreSQL多pg_trgm相似度评分子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30809334/

相关文章:

php - 多个值插入mysql数据库表

sql - 为什么 postgres 中的数组索引需要括号?

database - 如何在 Postgres 中找到用户自定义类型的属性信息?

python - 基于标签的共现图像聚类

scala - Spark : How to efficiently have intersections preserving duplicates (in Scala)?

python - 根据 pandas 数据框中的混合数据类型查找相似的行

mysql - SQL 查询 - 拆分字段中的字符串,扩展行以便它们包含子字符串

sql - 选择小数点后 4 位以上的数字

php - 如何使用数组中的参数从数据库中获取结果?

java - 为什么 PostgreSQL JDBC 驱动程序在身份验证期间向服务器发送错误的数据包 header ?