我在PostgreSQL数据库中有一个表,其中包含列c1,c2 ... cn.我想运行一个查询,将每一行与值v1,v2 ... vn的元组进行比较.查询不应返回完全匹配,但应返回以与值向量v递减相似的顺序排列的行列表.
例:
该表包含体育记录:
1,USA,basketball,1956
2,Sweden,basketball,1998
3,Sweden,skating,1998
4,Switzerland,golf,2001
Run Code Online (Sandbox Code Playgroud)
现在,当我使用v =(Sweden,basketball,1998)对此表运行查询时,我希望获得与此向量具有相似性的所有记录,并按匹配列的数量降序排序:
2,Sweden,basketball,1998 --> 3 columns match
3,Sweden,skating,1998 --> 2 columns match
1,USA,basketball,1956 --> 1 column matches
Run Code Online (Sandbox Code Playgroud)
不返回第4行,因为它根本不匹配.
编辑:所有列都同样重要.虽然,当我真的想到它...如果我能给每一列不同的权重因子,它将是一个很好的附加组件.
是否有任何可能的SQL查询会在合理的时间内返回行,即使我在一百万行中运行它?
这样的查询会是什么样的?
SELECT * FROM countries
WHERE country = 'sweden'
OR sport = 'basketball'
OR year = 1998
ORDER BY
cast(country = 'sweden' AS integer) +
cast(sport = 'basketball' as integer) +
cast(year = 1998 as integer) DESC
Run Code Online (Sandbox Code Playgroud)
虽不美丽,但还好。您可以将布尔表达式转换为整数并对它们求和。
您可以通过添加乘法器轻松更改权重。
cast(sport = 'basketball' as integer) * 5 +
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |