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