sql - Postgres 中的模糊分组

标签 sql postgresql group-by fuzzy

我有一个表格,其内容与此类似:

id | title
------------
1  | 5. foo
2  | 5.foo
3  | 5. foo*
4  | bar
5  | bar*
6  | baz
6  | BAZ

...等等。我想按标题分组并忽略多余的部分。我知道 Postgres 可以做到这一点:

SELECT * FROM (
  SELECT regexp_replace(title, '[*.]+$', '') AS title
  FROM table
) AS a
GROUP BY title

但是,这非常简单,如果我试图预测所有可能的变化,就会变得非常笨拙。那么,问题是,是否有比使用正则表达式更通用的模糊分组方法?这是否有可能,至少不会弄断背部?

编辑:澄清一下,对任何变体都没有偏好,这就是分组后表格的样子:

title
------
5. foo
bar
baz

即,变体是仅少数字符或大小写不同的项目,只要将它们分组,剩下哪些并不重要。

最佳答案

对于任何分组,您应该具有传递相等性,即a ~= b, b ~= c => a ~= c

严格使用文字来表述它,我们将尝试使用SQL来表述它。

例如,foo*bar 应该去哪个组?

更新:

此查询将所有非字母数字字符替换为空格,并返回每个组中的第一个标题:

SELECT  DISTINCT ON (REGEXP_REPLACE(UPPER(title), '[^[:alnum:]]', '', 'g')) title
FROM    (
        VALUES
        (1, '5. foo'),
        (2, '5.foo'),
        (3, '5. foo*'),
        (4, 'bar'),
        (5, 'bar*'),
        (6, 'baz'),
        (7, 'BAZ')
        ) rows (id, title)

关于sql - Postgres 中的模糊分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651229/

相关文章:

python - 生成的 Django 查询集有效,但在 Django 中运行失败

Postgresql alter table -> 添加列 + 值

linux - 如何避免 .psql_history 文件中的特殊字符

mysql - ebean中的复杂查询连接

mysql - 使用 MYSQL 查询以 if 条件连接 2 个表

sql - 基于 GROUP BY 结果的多重自连接

MySQL 来自多个表的最新相关记录

mysql - SQL group by 按列分组内的自定义分组集

sql - 如何增加每个非连续值的计数?

c# - 使用合并更新表并使用定义的表类型