如何使用 dataweave 2.0 聚合特定列的数据
How to aggregate data with particular column using dataweave 2.0
我有一个包含项目的有效负载和特定员工的工时详细信息。我想写一个数据编织来合并基于项目的小时数。由于 no.of 小时格式不是数字并且具有不同的格式(例如 02:00),因此我无法汇总小时数。
输入:
{
"response": {
"result": [
{
"jobName": "Project1",
"hours": "08:00"
},
{
"jobName": "Project1",
"hours": "08:00"
},
{
"jobName": "Project1",
"hours": "03:00"
},
{
"jobName": "Project2",
"hours": "08:00"
},
{
"jobName": "Project2",
"hours": "02:00"
},
{
"jobName": "Project3",
"hours": "06:00"
}
]
}
}
预期输出:
{
"Project1" : "19:00",
"Project2" : "10:00",
"Project3" : "06:00"
}
提前致谢
分解问题。您需要将字符串转换为数字;在这种情况下,最简单的数字就是总分钟数。然后你需要把它们全部加起来……最后把它们转换回来,但是减去 60,失去余数,然后做一个模数。请记住将数字格式化为字符串,以便我们得到 0 填充。
%dw 2.0
import sumBy from dw::core::Arrays
output application/json
fun hoursToMinutes(hours: String) : Number =
(hours[0 to 1] as Number * 60) + (hours[3 to 4] as Number)
fun minutesToHours(minutes: Number) : String =
"$(floor(minutes / 60) as String { format: "00" }):$((minutes mod 60) as String {format: "00"})"
fun sumHours(hours) : Number =
hours sumBy hoursToMinutes($.hours)
---
payload.response.result
groupBy $.jobName
mapObject ($$): minutesToHours(sumHours($))
编辑:将 sumHours
更改为 hours sumBy hoursToMinutes($.hours)
以提高可读性; sumBy
也在做 reduce
所以除了可读性之外没有任何收获。
我有一个包含项目的有效负载和特定员工的工时详细信息。我想写一个数据编织来合并基于项目的小时数。由于 no.of 小时格式不是数字并且具有不同的格式(例如 02:00),因此我无法汇总小时数。 输入:
{
"response": {
"result": [
{
"jobName": "Project1",
"hours": "08:00"
},
{
"jobName": "Project1",
"hours": "08:00"
},
{
"jobName": "Project1",
"hours": "03:00"
},
{
"jobName": "Project2",
"hours": "08:00"
},
{
"jobName": "Project2",
"hours": "02:00"
},
{
"jobName": "Project3",
"hours": "06:00"
}
]
}
}
预期输出:
{
"Project1" : "19:00",
"Project2" : "10:00",
"Project3" : "06:00"
}
提前致谢
分解问题。您需要将字符串转换为数字;在这种情况下,最简单的数字就是总分钟数。然后你需要把它们全部加起来……最后把它们转换回来,但是减去 60,失去余数,然后做一个模数。请记住将数字格式化为字符串,以便我们得到 0 填充。
%dw 2.0
import sumBy from dw::core::Arrays
output application/json
fun hoursToMinutes(hours: String) : Number =
(hours[0 to 1] as Number * 60) + (hours[3 to 4] as Number)
fun minutesToHours(minutes: Number) : String =
"$(floor(minutes / 60) as String { format: "00" }):$((minutes mod 60) as String {format: "00"})"
fun sumHours(hours) : Number =
hours sumBy hoursToMinutes($.hours)
---
payload.response.result
groupBy $.jobName
mapObject ($$): minutesToHours(sumHours($))
编辑:将 sumHours
更改为 hours sumBy hoursToMinutes($.hours)
以提高可读性; sumBy
也在做 reduce
所以除了可读性之外没有任何收获。