Как получить строку с продуктом max dot, используя MemSQL - PullRequest
0 голосов
/ 08 апреля 2020

Прежде всего, я начну с того, что имею минимальный опыт работы с 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) не работает?

1 Ответ

1 голос
/ 08 апреля 2020

Это просто недопустимо SQL:

SELECT id, identity, MAX(DOT_PRODUCT(template, JSON_ARRAY_PACK('[<probe template here>]'))) AS score
FROM collection;

У вас нет GROUP BY, но запрос является функцией агрегирования (из-за MAX(). Тогда есть два других столбца. Это недопустимо SQL, и это печально, что некоторые базы данных позволяют это.

Лучший подход - ORDER BY:

SELECT id, identity, DOT_PRODUCT(template, JSON_ARRAY_PACK('[<probe template here>]')) AS score
FROM collection
ORDER BY score DESC
LIMIT 1;   -- or whatever your database uses to limit to one row
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...