使用核心数据聚合每日平均值,移动平均线
Posted
技术标签:
【中文标题】使用核心数据聚合每日平均值,移动平均线【英文标题】:Aggregating daily avgs using Core Data, moving averages 【发布时间】:2016-04-25 22:05:09 【问题描述】:我有一个实体,它有一个“金额”属性和一个“日期”属性。我有很多这样的实体,一天中有多个。我想提供一个每日平均金额,比如一个月的时间。
我了解如何使用聚合函数获取每日金额的平均值。但我不明白如何返回数据集中所有日期的每日平均值列表。
似乎必须有比每天创建一个获取请求更好的方法?也许我必须以某种方式使用子查询?
(相关但不同,我还想计算一个移动平均线,这样我就可以返回一个 20 天的移动平均数。在这种情况下,一个平均值列表,每个是当天的 20 天平均值)
【问题讨论】:
【参考方案1】:Core Data 不是数据库。您可以在数据库中做一些需要在 Core Data 中编写代码的事情(从技术上讲,您也需要在数据库中编写代码)。这是您需要编写代码的情况。
因此,您可以每天获取并让商店计算平均值,也可以检索您感兴趣的所有数据并在内存中计算每日平均值。
每天进行一次提取会减少代码,但会更慢,因为您需要每天访问商店一次。
在内存中进行一次提取和计算会更快,但会占用更多代码。
就我个人而言,我会从商店中获取所有相关数据,然后遍历谓词并让谓词计算每天的平均值。
【讨论】:
嗨,马库斯。谢谢你的评论。看起来你在 Core Data 方面有很多经验,所以如果你能查看我发布的答案并在发现问题时发表评论,我将不胜感激。 有效吗?如果是这样,那么您不需要我的确认 :) 由于您能够调整数据模型和传入数据,因此您比原始问题暗示的灵活性更大,并且您找到了更清洁的解决方案。干得好:)【参考方案2】:所以,似乎对数据集稍作改动,这确实是可能的。但是,至少对于这个解决方案,您需要负责您的数据集。
我添加了一个属性“dateDay”,它是一个整数,表示从锚日期到我的实体中的“日期”属性的天数。 (见Number of days between two NSDates)
然后您按“dateDay”分组并使用“平均:”NSExpression。 NSExpression 聚合在使用 groupBy 时对组进行操作。
NSExpression* ex = [NSExpression expressionWithFormat:@"average:(amount)"];
NSExpressionDescription* ed = [[NSExpressionDescription alloc] init];
ed.name = @"result";
ed.expression = ex;
ed.expressionResultType = NSInteger32AttributeType;
NSFetchRequest* request = [[NSFetchRequest alloc] initWithEntityName:@"Transaction"];
request.resultType = NSDictionaryResultType;
request.propertiesToFetch = @[@"dateDay", ed];
request.propertiesToGroupBy = @[@"dateDay"];
NSError * error = nil;
NSArray * resultsArray = [context executeFetchRequest:request error:&error];
虽然 propertiesToGroupBy 被记录为采用 NSExpression,但它似乎无法执行计算,因此传递 NSExpression 以将 NSDate 减少到可以分组的组件是行不通的。因此需要额外的属性。
【讨论】:
以上是关于使用核心数据聚合每日平均值,移动平均线的主要内容,如果未能解决你的问题,请参考以下文章