在 dataweave 2、Mule 4 的嵌套数组中与 GroupBy 求和

Sum with GroupBy in Nested Arrays in dataweave 2, Mule 4

我想使用 join_date 进行分组并得到平均数量(通过对所有数量求和然后除以具有数量的记录数得出;不考虑那些没有数量的记录).

输入

{
    "number": 282,
    "topic": [
        {
            "fruit": "apple",
            "colour": "red",
            "join_date": "today",
            "quality": [
                {
                    "date": "2020-08-21",
                    "in": {
                        "feedback": "good",
                        "qty": "3 qty"
                    },
                    "out": {
                        "feedback": "poor",
                        "qty": "1 qty"
                    }
                },
                {
                    "date": "2020-08-21",
                   "in" :{}
                },

                {
                    "date": "2020-08-22",
                    "in": {
                        "feedback": "normal",
                        "qty": "3 qty"
                    }
                } 

]},
{
            "fruit": "banana",
            "colour": "yellow",
            "join_date": "Yesterday",
            "quality": []
} ] }

下面是预期输出的示例:

输出

number, fruit, colour, join_date, avginqty, avgoutqty
282, apple, red, today,  3 qty, 1 qty
282, banana, yellow, yesterday, ,

谢谢。

使用 groupBy 函数对记录进行分组并过滤以忽略所有小于零的数量。

filter

groupBy

基本转换如下,请相应添加groupBy和过滤-

    %dw 2.0
output application/csv
---
payload.topic[0].quality map ({
     number: payload.number,
     fruit: payload.topic[0].fruit,
     colour: payload.topic[0].colour,
     date:$."date",
     feedback_in: $.in.feedback,
     qty_in: $.in.qty,
     feedback_out: $.out.feedback,
     qty_out: $.out.qty
     })

对于您之前提出的问题 ,有很多方法可以解决问题,这应该让您有足够的想法开始着手解决问题。对于您的问题、输入和预期输出,请在您尝试(DW 脚本)中执行 post 以解决问题以及您遇到的问题。

您还可以利用教程附带的 playground 来帮助您更好地理解用法。

脚本

%dw 2.0
output application/csv
import * from dw::core::Arrays
---
flatten(payload.topic  groupBy $.join_date mapObject ((item) -> {
     temp: (if(sizeOf(item.quality)==0) [{}] else item.quality) default [{}] map {
     number: payload."number",
     fruit: item.fruit[0],
     colour: item.colour[0],    
     join_date: item."join_date"[0] default "",
     avginqty: ((($.in..qty) sumBy ($ splitBy " ")[0])/(($.in..qty) countBy ($ splitBy " ")[0] as Number  > -1)) ++ " qty" default " ",
     avgoutqty: ((($.out..qty) sumBy ($ splitBy " ")[0])/(($.out..qty) countBy ($ splitBy " ")[0] as Number  > -1)) ++ " qty" default " ",
     }
}) pluck $)

输出

number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,1 qty
282,banana,yellow,Yesterday, ,