在需求的应用场景,需要对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列进行分组,否则会导致结果不正确。如果还有其他需要汇总的列,则需要在子查询中一并处理。