# #sql #google-bigquery
Вопрос:
Я пытался объединить таблицы, одна из которых включает идентификатор пользователя, а другая содержит строку для каждого действия, предпринятого пользователем. Цель состоит в том, чтобы обобщить действия, которые пользователь совершал каждый день.
Таблица 1:
| UserId | date |
| -------- | -------------- |
| 13 | 2021-08-04 |
| 13 | 2021-08-05 |
| 13 | 2021-08-06 |
| 14 | 2021-08-04 |
| 14 | 2021-08-05 |
| 14 | 2021-08-06 |
| 15 | 2021-08-05 |
| 15 | 2021-08-06 |
Таблица 2:
Идентификатор пользователя | Дата действия | ActionVal |
---|---|---|
13 | 2021-08-04 | 2.6 |
13 | 2021-08-04 | 5 |
13 | 2021-08-05 | 15 |
14 | 2021-08-05 | 7 |
14 | 2021-08-05 | 2 |
14 | 2021-08-05 | 0 |
15 | 2021-08-05 | 13 |
15 | 2021-08-06 | 27 |
Мой вопрос:
SELECT Table1.UserId,Table1.date,aggTable2.tdTotalValue, aggTable2.controlDate, aggTable2.controlUserId
FROM Table1
JOIN(
SELECT
SUM(ActionVal) tdTotalValue,
ActionDate controlDate
UserId controlUserId
FROM Table2
GROUP BY ActionDate, UserId
) as aggTable2
ON aggTable2.controlDate = Table1.date AND Table1.UserId = aggTable2.controlUserId
GROUP BY aggTable2.controlDate,Table1.UserId
Однако это приводит к возвращению ошибки:
ВЫБЕРИТЕ список ссылок на выражения aggTable2.tdTotalValue, которые не сгруппированы и не агрегированы в соотношении 1:1
Это действительно странно для меня, так как я предварительно агрегировал таблицу, чтобы убедиться, что этого не произойдет.
Я потерян и благодарен за все советы.
Ответ №1:
Как бы то ни было, похоже, что вы уже позаботились об агрегации в подзапросе aggTable2 — вам следует просто удалить GROUP BY aggTable2.controlDate,Table1.UserId
(в последней строке вашего запроса)
Если вы сделаете это, результат будет
Я использовал приведенный ниже запрос в качестве теста (который дал результат выше)
SELECT
Table1.UserId,
Table1.date,
aggTable2.tdTotalValue,
aggTable2.controlDate,
aggTable2.controlUserId
FROM Table1
JOIN (
SELECT
SUM(ActionVal) tdTotalValue,
ActionDate controlDate,
UserId controlUserId
FROM Table2
GROUP BY ActionDate, UserId
) as aggTable2
ON aggTable2.controlDate = Table1.date
AND Table1.UserId = aggTable2.controlUserId
Примечание: предполагается, что у вас нет дубликатов в таблице 1, что, по — видимому, верно на основе выборочных данных
Комментарии:
1. Спасибо, я проверил свои данные , и в таблице 1 нет дубликатов, тем не менее, даже без группировки, я получаю ту же ошибку. Я упускаю что-то Важное для конкретного запроса?
2. Это просто не может быть правдой, поэтому, пожалуйста, дважды проверьте, действительно ли вы удалили эту последнюю группу!
3. Я добавил запрос, который я использовал для проверки образцов данных в вашем вопросе — проверьте его и дайте знать, если все еще проблема!
4. Вы правы, оставшаяся ошибка не была связана с этим. Спасибо за вашу помощь
5. конечно, рад, что мы это сделали :о)