我必须将一些数据发送到第三方系统。我有一个限制,平均只能发送 5 条记录。 (实际数量是数亿)。我从 Salesforce 获取这些记录。我正在编写一个 SOQL 查询以使用两个日期范围之间的 created_date 时间戳获取数据。由于每个请求平均只能发送 5 条记录,因此我必须通过调整 created_date 日期范围来限制 SOQL 查询返回的数据。
所以我必须动态找出要在我的查询中使用的 created_date 范围。为此,我首先触发 SOQL 查询以获取每天的记录数,如下所示
SELECT COUNT(Id) total, DAY_ONLY(CreatedDate) date
FROM Account
WHERE CreatedDate >= 2019-10-11T00:00:00Z AND CreatedDate <= 2019-12-03T23:59:59Z
GROUP BY DAY_ONLY(CreatedDate) order by DAY_ONLY(CreatedDate)
假设这给我下面的结果。
[
{
"total": "1",
"date": "2019-10-11"
},
{
"total": "2",
"date": "2019-10-17"
},
{
"total": "2",
"date": "2019-10-24"
},
{
"total": "4",
"date": "2019-10-30"
},
{
"total": "5",
"date": "2019-10-31"
},
{
"total": "6",
"date": "2019-11-01"
},
{
"total": "1",
"date": "2019-11-04"
},
{
"total": "1",
"date": "2019-11-06"
},
{
"total": "1",
"date": "2019-11-07"
},
{
"total": "2",
"date": "2019-11-08"
},
{
"total": "6",
"date": "2019-11-19"
},
{
"total": "2",
"date": "2019-11-20"
},
{
"total": "2",
"date": "2019-11-21"
},
{
"total": "4",
"date": "2019-11-22"
},
{
"total": "1",
"date": "2019-11-26"
},
{
"total": "2",
"date": "2019-11-27"
},
{
"total": "4",
"date": "2019-12-02"
},
{
"total": "1",
"date": "2019-12-03"
}
]
我想查看每个日期以及这些日期的 Salesforce 记录总数。对于来自 CreateDate 的第一个查询将修复“2019-10-11”。现在我必须通过对列表中接下来几天的记录总数求和直到它们的总和小于或等于 5 来找到 toCreateDate。
所以,在第一次迭代之后,我从第一个日期开始得到了 fromCreatDate 和 toCreatDate,如下所示。 2019-10-11 到 2019-10-24 为总和,等于 5.
[{
"fromCreatDate" : "2019-10-11"
"toCreatDate" : "2019-10-24"
}]
现在对于下一个日期范围,我的 fromCreatDate 将是上一个 toCreatDate 的下一个日期,例如 2019-10-30 共有 4 个。但是如果将 4 添加到下一个日期总数,总和将大于 5。所以它只需要一个 toCreateDate 日期。下一个日期总共有 5 个,因此它的日期与创建日期的起始日期和起始日期相同。下一个日期总共有 6 个,因此它的日期与创建日期的起始日期和起始日期相同。接下来的 4 天总共是 5 天的总和。所以他们的日期将变成创建日期和从创建日期开始,这个逻辑将继续下去。
预期产出
[{
"fromCreatDate" : "2019-10-11"
"toCreatDate" : "2019-10-24"
},
{
"fromCreatDate" : "2019-10-30"
"toCreatDate" : "2019-10-30"
},
{
"fromCreatDate" : "2019-10-31"
"toCreatDate" : "2019-10-31"
},
{
"fromCreatDate" : "2019-11-01"
"toCreatDate" : "2019-11-01"
},
{
"fromCreatDate" : "2019-11-04"
"toCreatDate" : "2019-11-08"
},
{
"fromCreatDate" : "2019-11-19"
"toCreatDate" : "2019-11-19"
},
{
"fromCreatDate" : "2019-11-20"
"toCreatDate" : "2019-11-21"
},
{
"fromCreatDate" : "2019-11-22"
"toCreatDate" : "2019-11-26"
},
{
"fromCreatDate" : "2019-11-27"
"toCreatDate" : "2019-11-27"
}
]
我会在上面的数组上做 forEach 并创建动态 SOQL 查询。
我创建了这个递归函数来计算任何总数的范围。对元素进行分组的逻辑在我的理解中并不完全一致,因此在第 19 天的预期输出存在差异。如果您进一步阐明逻辑,那么适应它应该不难。
我添加了一个包装函数,因此初始调用不需要额外的参数。
%dw 2.0
output application/json
fun getRangeofMaxTotal(list, maxTotal)=
do {
fun getRangeInternal(list, maxTotal, previousDate, previousTotal)=
do {
var thisTotal=(list[0].total default 0) as Number
var thisDate=list[0].date
var fromDate=previousDate default thisDate
var lastTotal=previousTotal default 0
---
if (isEmpty(list)) []
else if ((thisTotal + lastTotal) == maxTotal)
{fromCreatDate: fromDate, toCreatDate: thisDate} >> getRangeInternal( list[1 to -1], maxTotal, null, 0)
else if ((thisTotal + lastTotal) > maxTotal)
{fromCreatDate: fromDate, toCreatDate: fromDate} >> getRangeInternal( list[1 to -1], maxTotal, thisDate, thisTotal)
else
getRangeInternal( list[1 to -1], maxTotal, fromDate, thisTotal + lastTotal)
}
---
getRangeInternal(payload, maxTotal, null, 0)
}
---
getRangeofMaxTotal(payload, 5)
输出
[
{
"fromCreatDate": "2019-10-11",
"toCreatDate": "2019-10-24"
},
{
"fromCreatDate": "2019-10-30",
"toCreatDate": "2019-10-30"
},
{
"fromCreatDate": "2019-10-31",
"toCreatDate": "2019-10-31"
},
{
"fromCreatDate": "2019-11-01",
"toCreatDate": "2019-11-01"
},
{
"fromCreatDate": "2019-11-04",
"toCreatDate": "2019-11-08"
},
{
"fromCreatDate": "2019-11-19",
"toCreatDate": "2019-11-19"
},
{
"fromCreatDate": "2019-11-19",
"toCreatDate": "2019-11-19"
},
{
"fromCreatDate": "2019-11-20",
"toCreatDate": "2019-11-20"
},
{
"fromCreatDate": "2019-11-22",
"toCreatDate": "2019-11-26"
},
{
"fromCreatDate": "2019-11-27",
"toCreatDate": "2019-11-27"
},
{
"fromCreatDate": "2019-12-02",
"toCreatDate": "2019-12-03"
}
]