我有一個具有「金額」屬性和「日期」屬性的實體。我有許多這些實體,一天中有多個。我想提供每日平均的金額,例如在一個月的時間內。使用核心數據彙總每日平均數,移動平均數
我明白如何使用集合函數來獲得一天的金額的平均值。但我不明白如何返回數據集中所有日期的每日平均值列表。
看起來好像有一個比每天創建提取請求更好的方法?也許我必須以某種方式利用子查詢?
(相關,但不同,我也想計算一個移動平均數,這樣我可以返回,比如20天移動平均數量,在這種情況下,一個平均值列表,這是當天的20天平均值)
我有一個具有「金額」屬性和「日期」屬性的實體。我有許多這些實體,一天中有多個。我想提供每日平均的金額,例如在一個月的時間內。使用核心數據彙總每日平均數,移動平均數
我明白如何使用集合函數來獲得一天的金額的平均值。但我不明白如何返回數據集中所有日期的每日平均值列表。
看起來好像有一個比每天創建提取請求更好的方法?也許我必須以某種方式利用子查詢?
(相關,但不同,我也想計算一個移動平均數,這樣我可以返回,比如20天移動平均數量,在這種情況下,一個平均值列表,這是當天的20天平均值)
核心數據不是數據庫。您可以在數據庫中執行某些操作,您需要在Core Data中編寫代碼(技術上,您還需要在數據庫中編寫代碼)。這是您需要編寫代碼的情況。
因此,您可以每天獲取並讓商店計算平均值,或者您可以檢索所有您感興趣的數據並在內存中執行日常平均值。
每天做一次抓取的代碼會少一些,但是會比較慢,因爲每天需要打一次商店。
在內存中執行一次提取和計算會更快,但會佔用更多代碼。
就我個人而言,我會從商店獲取所有相關數據,然後遍歷謂詞並讓謂詞計算每天的平均值。
因此,它似乎與數據集稍有變化,這確實是可能的。但是,至少對於這個解決方案來說,你需要負責你的數據集。
我添加了一個屬性「dateDay」,它是一個int,表示從我的實體中的錨定日期到「date」屬性的天數。 (請參閱Number of days between two NSDates)
然後,您按「dateDay」進行分組並使用「average:」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成能在不工作進行分組的組件。因此需要額外的屬性。
嗨馬庫斯。謝謝你的評論。看起來你在覈心數據方面有很多經驗,所以如果你看到我發佈的答案和評論,如果你看到問題,我會很感激。 – user903309
它工作嗎?如果是這樣,那麼你不需要我的確認:)因爲你可以調整數據模型和輸入數據,所以你比原來隱含的問題具有更大的靈活性,並且你找到了一個更清晰的解決方案。做得好 :) –