У меня есть таблица с содержимым, которые выглядят примерно так:Fuzzy группировка в Postgres
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
Однако, это довольно просто и получил бы очень громоздким, если бы я пытался предвидеть все возможные варианты. Итак, вопрос в том, существует ли более общий способ создания нечеткой группировки, чем при использовании regexp? Возможно ли это, по крайней мере, не нарушая этого?
Edit: Для того, чтобы уточнить, нет предпочтения какой-либо из вариантов, и это то, что таблица должна выглядеть после группировки:
title
------
5. foo
bar
baz
Т.е., изменения были бы элементы, которые отличаются только по несколько символов или заглавные буквы, и неважно, какие из них остались, пока они сгруппированы.
В свою группу, так как она недостаточно похожа на другие предметы. Вот почему возникает вопрос о нечеткой группировке: неважно, какой из вариантов заканчивается в группе, просто важно, чтобы они были сгруппированы вообще. – slikts
'Reinis I.': * достаточно похожий * обычно не транзитивен, этот menas он не сгруппирован. Если, скажем, 'foo' достаточно похоже на' for', а 'for' достаточно похоже на' bar', но 'foo' недостаточно похож на' bar', то вы не можете создавать какие-либо группы. – Quassnoi
Я не говорю, что это может быть сделано, я спрашиваю, как обойти это. – slikts