DataWeave 中的分组和平均平面数据

Group By and Average Flat Data in DataWeave

输入:

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

输出:

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

尝试次数: 但出现此错误:无法将对象强制转换为字符串

(payload groupBy (key,index) ->(key.number ++ key.join_date)) mapObject {
   a: {
       number: $[0].number,
       fruit: $[0].fruit,
       colour: $[0].colour,
       join_date:$[0].join_date,
       avginqty: sum($.avginqty)/sizeOf($.avginqty),
       avgoutqty: sum($.avgoutqty)/sizeOf($.avgoutqty)
   }
}

有以下输入

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

并使用以下 脚本

%dw 2.0
output application/csv
import * from dw::core::Arrays
---

(payload groupBy (key,index) ->(key.number ++ key.join_date)) mapObject {
   a: {
       number: $[0].number,
       fruit: $[0].fruit,
       colour: $[0].colour,
       join_date:$[0].join_date,
       avginqty: ($.avginqty sumBy (if($ == "") 0 else $))/sizeOf($.avginqty) ++ " qty",
       avgoutqty: ($.avgoutqty sumBy (if($ == "") 0 else $))/sizeOf($.avgoutqty) ++ " qty"    
   }
} pluck $

你会得到输出

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

在你之前的一个问题中(我用 4 个变体回答了这个问题(其中一个场景确实解决了你的最后一个问题(如果输入有 qty 字符串作为数量的一部分))。但是你可以使用正在关注

输入

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

脚本

%dw 2.0
output application/csv
import * from dw::core::Arrays
---

(payload groupBy (key,index) ->(key.number ++ key.join_date)) mapObject {
   a: {
       number: $[0].number,
       fruit: $[0].fruit,
       colour: $[0].colour,
       join_date:$[0].join_date,
       avginqty: ($.avginqty sumBy (if(($ splitBy " ")[0] == "") 0 else ($ splitBy " ")[0] as Number ))/sizeOf($.avginqty) ++ " qty",
       avgoutqty: ($.avgoutqty sumBy (if(($ splitBy " ")[0] == "") 0 else ($ splitBy " ")[0] as Number))/sizeOf($.avgoutqty) ++ " qty"    
   }
} pluck $

输出

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

以防您希望跳过数量为“”的行来进行平均计算。虽然这可能会导致在边缘情况下出现被零除错误,其中所有行都具有这些数量之一,如“”

avginqty: ($.avginqty sumBy (if($ == "") 0 else $))/(sizeOf($.avginqty filter $ != "")) ++ " qty",
avgoutqty: ($.avgoutqty sumBy (if($ == "") 0 else $))/(sizeOf($.avgoutqty filter $ != "")) ++ " qty"

避免 DBZ 错误

avginqty: if((sizeOf($.avginqty filter $ != "")) != 0) ($.avginqty sumBy (if($ == "") 0 else $))/(sizeOf($.avginqty filter $ != "")) ++ " qty" else "", 
avgoutqty: if((sizeOf($.avgoutqty filter $ != "")) != 0) ($.avgoutqty sumBy (if($ == "") 0 else $))/(sizeOf($.avgoutqty filter $ != "")) ++ " qty" else ""

配置不同输入的屏幕截图。 (所有值)