在 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 函数对记录进行分组并过滤以忽略所有小于零的数量。
基本转换如下,请相应添加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, ,
我想使用 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 函数对记录进行分组并过滤以忽略所有小于零的数量。
基本转换如下,请相应添加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
})
对于您之前提出的问题
您还可以利用教程附带的 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, ,