Mule 4 DataWeave 2 嵌套数组按join_date分组求平均qty实现问询
解决方案
你可以直接使用如下DataWeave 2代码实现需求:
%dw 2.0 output application/csv header=true // 提取全局共用的number字段值 var globalNumber = payload.number --- payload.topic map (item) -> { number: globalNumber, fruit: item.fruit, colour: item.colour, // 转为小写匹配预期输出格式 join_date: lower(item.join_date), avginqty: do { // 过滤出in方向有qty的有效记录 var validInRecords = item.quality.*in filter ($.qty?) // 提取qty数值部分求和 var totalIn = sum(validInRecords.*qty map (substringBefore($, " qty") as Number)) var countIn = sizeOf(validInRecords) --- if(countIn > 0) (totalIn / countIn) as String ++ " qty" else "" }, avgoutqty: do { // 过滤出out方向有qty的有效记录 var validOutRecords = item.quality.*out filter ($.qty?) // 提取qty数值部分求和 var totalOut = sum(validOutRecords.*qty map (substringBefore($, " qty") as Number)) var countOut = sizeOf(validOutRecords) --- if(countOut > 0) (totalOut / countOut) as String ++ " qty" else "" } }
逻辑说明
- 用
*in/*out选择器批量提取quality数组下所有in、out方向的对象,过滤掉无qty字段的记录,符合你要求的无qty不纳入统计的规则 - 通过
substringBefore提取qty的数值部分做算术运算,计算完成后再拼接qty后缀,和预期输出格式匹配 - 自动适配quality为空数组的场景,此时有效记录数为0,对应平均字段返回空值
- 对join_date做小写转换,匹配预期输出的
yesterday格式要求
如果需要控制平均qty的小数精度,可以在数值转字符串时增加格式参数,例如(totalIn / countIn) as String {format: "0.##"}即可保留最多2位小数。
内容的提问来源于stack exchange,提问作者poppp
相关产品推荐
相关产品推荐

