У меня возникли проблемы с созданием эффективного SQL-запроса для обработки следующей ситуации:
Предположим, у нас есть таблица с двумя столбцами
groupId : int
value : float
Таблица огромная (несколько миллионов строк). Существует различное количество «значений» для «groupId» - скажем, от 100 до 50 000. Все значения с плавающей запятой больше или равны нулю, но в остальном не ограничены.
Для данного groupId запрос должен возвращать все остальные группы, отсортированные по уменьшению подобия, где «похожие» определяются как минимальное евклидово расстояние между всеми возможными парами из 30 значений в двух группах.
Меня убивает именно это определение сходства. Я думаю, что для вычисления сходства, как определено выше, наивным алгоритмом является O (n ^ 2). Теперь я ищу идеи, чтобы либо переопределить «подобие», либо эффективную реализацию вышеизложенного. Я мог бы представить решение, включающее k-ближайших соседей, что-то вроде геометрических ближайших соседей PostGis или, возможно, алгоритм наибольшей общей подпоследовательности (хотя мне понадобится «нечеткая» реализация последнего, потому что «значения» вряд ли когда-либо будут сравниваться точно равными) .
В настоящее время мы используем mySQL, если это имеет значение.
ваше здоровье,
Sören