【问题标题】:Aggregating daily avgs using Core Data, moving averages使用核心数据聚合每日平均值,移动平均线
【发布时间】:2016-04-25 22:05:09
【问题描述】:

我有一个实体,它有一个“金额”属性和一个“日期”属性。我有很多这样的实体,一天中有多个。我想提供一个每日平均金额,比如一个月的时间。

我了解如何使用聚合函数获取每日金额的平均值。但我不明白如何返回数据集中所有日期的每日平均值列表。

似乎必须有比每天创建一个获取请求更好的方法?也许我必须以某种方式使用子查询?

(相关但不同,我还想计算一个移动平均线,这样我就可以返回一个 20 天的移动平均数。在这种情况下,一个平均值列表,每个是当天的 20 天平均值)

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller nsfetchrequest


    【解决方案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 减少到可以分组的组件是行不通的。因此需要额外的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-22
      • 2017-09-01
      • 2017-11-12
      • 2013-12-24
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多