Databricks SQL含子查询与Group By报错:需添加至Group By或用first()包裹
问题原因
Databricks SQL(基于Spark SQL)的GROUP BY规则比MS SQL更严格:SELECT子句里所有非聚合的列必须出现在GROUP BY中。你的原查询在外层直接用ts_inititals作为concat_ws的参数,但既没把它放进GROUP BY,也没包裹在聚合函数里,这就违反了规则,导致报错。
修正方案
要把同一个activityid对应的所有ts_inititals拼成逗号分隔的字符串,得先用聚合函数把这些值收集起来,再做拼接。常用的聚合函数有两个:
collect_list:保留重复值(如果同一个用户多次关联到同一个活动)collect_set:自动去重(每个用户只出现一次)
保留重复值的版本
SELECT activityid, concat_ws(', ', collect_list(ts_inititals)) AS attendees FROM baseorigination.activityparty LEFT JOIN baseorigination.systemuser ON activityparty.partyid = systemuser.systemuserid WHERE ts_inititals IS NOT NULL -- 过滤掉未匹配到用户的空值 GROUP BY activityid;
去重版本
SELECT activityid, concat_ws(', ', collect_set(ts_inititals)) AS attendees FROM baseorigination.activityparty LEFT JOIN baseorigination.systemuser ON activityparty.partyid = systemuser.systemuserid WHERE ts_inititals IS NOT NULL GROUP BY activityid;
补充说明
原查询里的子查询完全没必要,直接在主查询里关联两张表再聚合就行。加WHERE ts_inititals IS NOT NULL是为了避免LEFT JOIN时没找到用户导致的空值混入结果,防止最终字符串出现多余的逗号。
内容的提问来源于stack exchange,提问作者Patterson
相关产品推荐
相关产品推荐

