如何在 GROUP BY 之前对 Core Data 记录进行排序?

Posted

技术标签:

【中文标题】如何在 GROUP BY 之前对 Core Data 记录进行排序?【英文标题】:How can I sort Core Data records before GROUP BY? 【发布时间】:2020-12-18 15:23:24 【问题描述】:

想象一下我有这个核心数据实体

@objc(SomeEntity)
class SomeEntity: NSManagedObject 
  @NSManaged var date: Date
  @NSManaged var timeZoneIdentifier: String
  @NSManaged var name: String
  @NSManaged var brand: String

我想获取具有不同 namebrand 字段的所有行,但对于每一行,我想要 最新的 datetimeZoneIdentifier 的最新 date 行。

以下是一些示例数据:

date timeZoneIdentifier name brand
2020-01-01 America/Los_Angeles Name 1 Brand 1
2020-01-02 America/Tiajuana Name 1 Brand 1
2020-01-03 America/Denver Name 1 Brand 2
2020-01-04 America/Phoenix Name 2 Brand 1

我基本上想获取如下所示的.dictionaryResultType 结果:

lastDate lastDateTimeZoneIdentifier name brand
2020-01-02 America/Tiajuana Name 1 Brand 1
2020-01-03 America/Denver Name 1 Brand 2
2020-01-04 America/Phoenix Name 2 Brand 1

你可以用这个 SQL 查询做什么:

SELECT * FROM (SELECT * FROM SomeEntity ORDER BY date DESC) as sub GROUP BY sub.name, sub.brand;

我可以通过最少的查询使用 Core Data 实现相同的目标吗?我在网上找不到任何示例或文档来尝试做这样的事情。

我可以写一个NSFetchRequest 基本上执行这个:

SELECT date, timeZoneIdentifier, name, brand FROM SomeEntity GROUP BY name, brand ORDER BY date;

但是那个命令在 GROUP BY 之后,而不是之前。

我也可以写一个NSFetchRequest 来执行这个:

SELECT max(date), name, brand FROM SomeEntity GROUP BY name, brand;

几乎仅因为我想要最新日期而起作用,但当然我丢失了该行来自的timeZoneIdentifier。 I have written up this example as a gist 你可以扔进 Swift 游乐场。

谢谢!

【问题讨论】:

您可能已经发现,除了您分组的属性和聚合函数之外,您不能指定任何 propertiesToFetch。因此,您不能包含 timeZoneIdentifier。但是,您可以包含一个表示评估对象的 NSExpression(请参阅 NSExpression.expressionForEvaluatedObject)。这将为您提供具有 max(date) 的对象的 objectID - 然后您可以获取该对象以获取其他属性值。 就是这样@pbasdf!两个查询而不是 O(n)。我更新了要点:gist.github.com/jmacdonagh/714b52a0f545a65bad26b233cb2315b9。随意提交一个实际的答案,所以我可以给你信用!谢谢! 【参考方案1】:

您可能已经发现,除了分组依据的属性和聚合函数之外,您不能指定任何 propertiesToFetch。因此,您不能包含timeZoneIdentifier

但是,您可以包含一个代表评估对象的NSExpression(请参阅NSExpression.expressionForEvaluatedObject)。这将为您提供带有 max(date) 的对象的 objectID - 然后您可以获取该对象以获取其他属性值。

【讨论】:

谢谢!对于这个问题的未来读者,您可以在我更新的要点gist.github.com/jmacdonagh/714b52a0f545a65bad26b233cb2315b9 上看到一个可行的解决方案

以上是关于如何在 GROUP BY 之前对 Core Data 记录进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?

如何在蛋糕php 3中在Group by之前执行Order by?

如何在 GROUP BY 之前订购此数据库 [重复]

asp.net core 3.0 新手问题:如何这段带“count” 和 group by的sql代码,怎么转成 linq的写法?

EF Core group by 和 order by

计算group_by中行之间的差异分数