sql聚合函数嵌套问题 aggregate function cannot contain aggregate parameters

在需求的应用场景,需要对create_time字段求最小值并求和,刚开始理所当然写成像下面这样:

 SUM(COALESCE (CASE WHEN MIN(crl.create_time)  BETWEEN date_add(date_sub(current_date(), 1), -1 * (open_case_day_num % 6)) AND current_date() AND  crl.approval_status in('0','1') and crl.del_flag = '0' THEN  CAST(crl.repay_total AS DECIMAL(10, 2)) END,0))

SUM聚合函数又嵌套MIN函数,果然报错了:
1105 – errCode = 2, detailMessage = aggregate function cannot contain aggregate parameters

这是因为 根据错误日志,问题出在了对于SUM函数中的聚合参数的使用上。在Spark SQL中,聚合函数不能包含聚合参数,也就是不允许在聚合函数内部再使用其他聚合函数。

解决方案是可以先使用子查询,将MIN(create_time)计算结果作为一个新的列,然后在外层查询中对这个新列和其他列进行求和,如下所示:

SELECT SUM(amount), SUM(min_create_time)
FROM (
  SELECT amount, MIN(create_time) AS min_create_time
  FROM your_table
  GROUP BY amount
) t;

其中,我们首先在子查询中计算每个amount的最小create_time,并将结果存储在名为min_create_time的新列中。然后,在外部查询中,我们对amount列和min_create_time列同时进行汇总。

需要注意的是,在子查询中,我们只能按照amount列进行分组,否则会导致结果不正确。如果还有其他需要汇总的列,则需要在子查询中一并处理。

关注公众号“大模型全栈程序员”回复“大数据面试”获取800页左右大数据面试宝典 ,回复“大数据”获取多本大数据电子书

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注