Использование GROUP BY в AWS QLDB / Partiql - PullRequest
0 голосов
/ 29 марта 2020

В моей таблице AWS QLDB есть следующая таблица:

INSERT INTO Testing << {
    'MyId': 1,
    'MyList': [ 'Item1', 'Item2', 'Item3']
},
{
    'MyId': 2,
    'MyList': [ 'Item2', 'Item3', 'Item4']
},
{
    'MyId': 3,
    'MyList': [ 'Item4', 'Item5', 'Item6']
}
>>

Мне нужно иметь возможность получить все документы, содержащие список элементов (которые не взяты из другой таблицы), для которого я использую следующий запрос:

SELECT *
FROM Testing AS t,
     t.MyList AS l
WHERE l IN ('Item1', 'Item2', 'Item4')

Тем не менее, это дает следующий вывод

+------+---------------------------+---------+
| MyId | MyList                    | _3      |
+------+---------------------------+---------+
| 3    | ["Item4","Item5","Item6"] | "Item4" |
+------+---------------------------+---------+
| 1    | ["Item1","Item2","Item3"] | "Item1" |
+------+---------------------------+---------+
| 1    | ["Item1","Item2","Item3"] | "Item2" |
+------+---------------------------+---------+
| 2    | ["Item2","Item3","Item4"] | "Item2" |
+------+---------------------------+---------+
| 2    | ["Item2","Item3","Item4"] | "Item4" |
+------+---------------------------+---------+

Я хочу иметь возможность получить только три отдельных строки. Судя по ошибке, которую я получаю при попытке использовать DISTINCT, QLDB не поддерживает его, но я бы предпочел использовать * в моем SELECT, поэтому я пытаюсь использовать GROUP BY

SELECT *
FROM Testing AS t,
     t.MyList AS l
WHERE l IN ('Item1', 'Item2', 'Item4')
GROUP BY t.MyId

Но это дает следующую ошибку:

Ошибка запуска запроса
Семанти c Ошибка: в строке, столбце: такой переменной нет с именем '$ __ partiql__group_by_1_item_0'; Нет такой переменной с именем '$ __ partiql__group_by_1_item_0' (Служба: AmazonQLDBSession; Код состояния: 400; Код ошибки: BadRequestException; Идентификатор запроса: 65vrQHytqHdEL3o9Ym9Xn4)

1 Ответ

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

Ни DISTINCT, ни GROUP BY в настоящее время не поддерживаются в QLDB, как указано пропуском из ссылки SELECT. К сожалению, в этом случае сообщение об ошибке вводит в заблуждение.

Предполагается, что что ваш MyId столбец сам по себе уникален, вы можете express, что вы хотите, отфильтровав списки, проверив наличие каждого элемента в списке, например:

SELECT *
FROM Testing AS t
WHERE 'Item1' IN t.MyList OR 'Item2' IN t.MyList OR 'Item3' IN t.MyList

Если вы хотите продолжить Отфильтровывая полученные списки, вы можете добавить вложенный SELECT с вашим оригинальным фильтром , как описано здесь :

SELECT t.MyId, (SELECT VALUE l FROM t.MyList WHERE l IN ('Item1', 'Item2', 'Item3'))
FROM Testing AS t
WHERE 'Item1' IN t.MyList OR 'Item2' IN t.MyList OR 'Item3' IN t.MyList

Хотя это немного неудобно, вы, вероятно, не захотите в любом случае выполните GROUP BY, так как это сгруппировало бы весь набор данных (требующий полной агрегации), когда внутри него содержится items для каждого t.

...