Нечеткая группировка в Постгресе - PullRequest
2 голосов
/ 30 октября 2009

У меня есть таблица с содержимым, похожим на это:

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

Т.е., вариациями могут быть элементы, отличающиеся только несколькими символами или прописными буквами, и не имеет значения, какие из них остаются, пока они сгруппированы.

Ответы [ 2 ]

3 голосов
/ 30 октября 2009

Для любой группировки у вас должно быть транзитивное равенство, то есть 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)
2 голосов
/ 30 октября 2009

В какой-то момент вам придется определить, что делает набор значений принадлежащими друг другу в группе. Если это слишком сложно, возможно, вам следует запретить и запретить ввод нечетких данных, или, если вы должны разрешить это, добавьте столбец, содержащий обеззараженную версию заголовка для использования в операциях группировки.

...