使用预先聚合的值加入两个表,既不会导致分组错误,也不会导致聚合错误

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 中的错误“选择列表表达式 [...] 既不分组也不聚合的引用”?

SQL嵌套聚合分组错误

Oracle:使用来自同一表的聚合值更新表中的值

003.分组统计查询和表连接查询

如何通过 Eloquent 中具有多对多关系的外部表中的列聚合进行分组?

T-SQL GROUP BY 也使用 JOIN、聚合和外部引用错误