Использование GROUP BY в AWS QLDB / Partiql

В моей таблице 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

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

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

1 ответ

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

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

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 содержатся внутри него.

Другие вопросы по тегам