在Slick 3.x中按组从列中选择最大项目

时间:2016-07-15 16:11:20

标签: sql postgresql scala slick

我试图编写一个Slick查询来查找" max"组中的元素,然后根据该结果继续查询,但是当我尝试我认为显而易见的方式时,我遇到了大量错误:

val articlesByUniqueLink = for {
  (link, groupedArticles) <- historicArticles.groupBy(_.link)
  latestPerLink <- groupedArticles.sortBy(_.pubDate.desc).take(1)
} yield latestPerLink

由于这似乎不起作用,我想知道是否还有其他方法可以找到&#34;最新的&#34;元素&#34;分组文章&#34;上面,假设这些来自带有pubDate时间戳的Article表和可以复制的链接。我有效地寻找HAVING articles.pub_date = max(articles.pub_date)

表达它的另一种等效方式产生相同的结果:

val articlesByUniqueLink = for {
  (link, groupedArticles) <- historicArticles.groupBy(_.link)
  latestPerLink <- groupedArticles.filter(_.pubDate === groupedArticles.map(_.pubDate).max.get)
} yield latestPerLink

[SlickTreeException:在解析monadic连接+ 50行Slick节点树后无法访问s2。

1 个答案:

答案 0 :(得分:1)

在Slick中,我发现每个组的最大,最小或其他最佳方法是对分组结果使用自连接:

val articlesByUniqueLink = for {
  (article, _) <- historicArticles join historicArticles.groupBy(_.link)
      .map({case (link, group) => (link, group.map(_.pubDate).max)})
          on ((article, tuple) => article.link === tuple._1 && 
              article.pubDate === tuple._2)
} yield article

如果有可能产生具有on条件的重复项,只需在其后放下this之类的重复项。