Прежде всего, я начну с того, что имею минимальный опыт работы с SQL.
В любом случае, у меня есть таблица в Mem SQL следующего формата:
+-----+--------+----------+----------+
| id | uuid | identity | template |
+-----+--------+----------+----------+
| int | string | string | blob |
+-----+--------+----------+----------+
Я пытаюсь использовать функцию Mem SQL DOT_PRODUCT
для получения identity
шаблона, который генерирует максимальное произведение точек на предоставленный мною вектор зонда. Шаблон заметки - это нормализованный массив чисел с плавающей запятой фиксированной длины.
Мой оператор SQL выглядит следующим образом:
SELECT id, identity, MAX(DOT_PRODUCT(template, JSON_ARRAY_PACK('[<probe template here>]')))
AS score FROM collection;
Однако я, кажется, испытываю странное поведение, когда я получаю противоречивые результаты (1 из 10 раз, когда я выполню запрос, я получу другую идентичность, но всегда ту же максимальную оценку). Кроме того, identity
является неправильным (см. Далее ниже).
Результат запроса следующий (9 из 10 раз):
+----+-------------+------------------+
| id | identity | score |
+----+-------------+------------------+
| 7 | armstrong_2 | 0.56488848850131 |
+----+-------------+------------------+
В качестве проверки работоспособности, Я написал следующее заявление SQL, ожидая, что максимум будет таким же. Обратите внимание, я использую точно такой же вектор зонда, как и раньше:
SELECT id, identity, DOT_PRODUCT(template, JSON_ARRAY_PACK('[<same probe template from before>]'))
AS score FROM collection ORDER BY score DESC;
Результаты следующие:
+----+--------------+--------------------+
| id | identity | score |
+----+--------------+--------------------+
| 1 | armstrong_1 | 0.56488848850131 |
| 21 | armstrong_1 | 0.56488848850131 |
| 6 | armstrong_1 | 0.56488848850131 |
| 11 | armstrong_1 | 0.56488848850131 |
| 16 | armstrong_1 | 0.56488848850131 |
| 17 | armstrong_2 | 0.534708674997091 |
| 7 | armstrong_2 | 0.534708674997091 |
| 22 | armstrong_2 | 0.534708674997091 |
| 2 | armstrong_2 | 0.534708674997091 |
| 12 | armstrong_2 | 0.534708674997091 |
| 10 | mr_bean_2 | 0.072085081599653 |
| 15 | mr_bean_2 | 0.072085081599653 |
| 5 | mr_bean_2 | 0.072085081599653 |
| 20 | mr_bean_2 | 0.072085081599653 |
| 25 | mr_bean_2 | 0.072085081599653 |
| 14 | mr_bean | 0.037121964152902 |
| 9 | mr_bean | 0.037121964152902 |
| 4 | mr_bean | 0.037121964152902 |
| 19 | mr_bean | 0.037121964152902 |
| 24 | mr_bean | 0.037121964152902 |
| 13 | jimmy_carter | -0.011749440804124 |
| 23 | jimmy_carter | -0.011749440804124 |
| 18 | jimmy_carter | -0.011749440804124 |
| 8 | jimmy_carter | -0.011749440804124 |
| 3 | jimmy_carter | -0.011749440804124 |
+----+--------------+--------------------+
Что происходит? Почему идентификатор MAX
из первого запроса не совпадает с идентификатором max (верхняя строка) для второго запроса? Один или оба моих запроса неверны?
Кроме того, когда я вычисляю точечное произведение вручную (без каких-либо SQL или Mem SQL), я обнаруживаю, что armstrong_1
действительно дает самый высокий результат 0.56488848850131
. Так почему мой первый запрос SQL (с оператором MAX
) не работает?