使用预先聚合的值加入两个表,既不会导致分组错误,也不会导致聚合错误
Posted
技术标签:
【中文标题】使用预先聚合的值加入两个表,既不会导致分组错误,也不会导致聚合错误【英文标题】:Join two tables with pre aggregated Values results in neither grouped nor aggregated error 【发布时间】:2021-08-13 19:44:48 【问题描述】:我一直在尝试连接表,其中一个包含 UserId,另一个包含用户执行的每个操作的行。目标是汇总用户每天执行的操作。
表 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:
UserID | ActionDate | 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
但是,这会导致返回错误: SELECT 列表表达式引用 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 中没有重复项,不过,即使没有分组,我也会收到相同的错误。我是否遗漏了 Big Query 特定的内容? 这根本不可能是真的,所以请仔细检查你是否真的删除了最后一组! 我添加了用于测试您问题中的样本数据的查询 - 检查一下,如果仍然存在问题,请告知! 您是对的,其余错误与此无关。感谢您的帮助 当然,很高兴我们做到了:o)以上是关于使用预先聚合的值加入两个表,既不会导致分组错误,也不会导致聚合错误的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 BigQuery 中的错误“选择列表表达式 [...] 既不分组也不聚合的引用”?