Объединение двух таблиц с предварительно агрегированными значениями не приводит ни к группировке, ни к агрегированной ошибке

# #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. конечно, рад, что мы это сделали :о)