我有一个具有“amount”属性和“date”属性的实体。我有很多这样的实体,一天多个。我想提供每日平均金额,比如在一个月的时间内。
我理解如何使用聚合函数获得当天平均值的金额。但我不明白如何返回我的数据集中所有日期的每日平均值列表。
似乎必须有比每天创建获取请求更好的方法吗?也许我必须以某种方式利用子查询?
(相关,但不同,我也想计算一个移动平均线,以便我可以返回20天的移动平均数。在这种情况下,平均列表,每个是当天的20天平均值)
答案 0 :(得分:0)
核心数据不是数据库。你可以在数据库中做一些你需要在Core Data中编写代码的东西(技术上你也需要在数据库中编写代码)。在这种情况下,您需要编写代码。
因此,您可以每天获取并让商店计算平均值,或者您可以检索您感兴趣的所有数据并在内存中执行每日平均值。
每天进行一次提取会减少代码,但会慢一些,因为您需要每天点击一次商店。
在内存中进行一次获取和计算会更快但需要更多代码。
就个人而言,我会从商店中获取所有相关数据,然后迭代谓词并让谓词计算每天的平均值。
答案 1 :(得分:0)
因此,似乎对数据集稍有改动,这确实是可能的。但是,至少对于这个解决方案,您需要负责数据集。
我添加了一个属性" dateDay"这是一个int,表示从锚定日期到" date"我的实体中的属性。 (见Number of days between two NSDates)
然后你按" dateDay"分组并使用"平均值:" NSExpression。使用groupBy时,NSExpression聚合对组进行操作。
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减少为可以分组的组件不起作用。因此需要额外的属性。