【问题标题】:Slick 2.1.0 GroupBy and fetch all columnsSlick 2.1.0 GroupBy 并获取所有列
【发布时间】:2015-05-29 23:32:00
【问题描述】:

对于如下表结构:

id externalId name version
1  10         n1   1
2  65         n2   2
3  10         n3   2
4  77         n4   1 

我正在尝试获取具有按 externalId 分组的最大版本的所有条目(所有列)。预期的结果应该是:

id externalId name version
2  65         n2   2
3  10         n3   2
4  77         n4   1 

为此,我定义了以下精巧查询:

val resulting = myTableEntries
 .groupBy(x => x.externalID)
 .map { 
   case (id, group) => 
     (id, group.map(_.version).max) 
 }

我怎样才能得到所有的列,而不仅仅是 id 和版本?

实际上我需要的是以下 SQL 的 Slick 版本:

select myTable.id, myTable.name, myTable.externalId, myTable.version
    from MyTable myTable
    where version = 
        (select max(revision) from MyTable myTable1 where myTable.id=myTable1.id)

【问题讨论】:

  • 这不是在 SQL 中使用group byhaving 完成的吗?
  • 是的,我想在 Slick 中这样做!

标签: scala slick


【解决方案1】:

基于this examplethis answer,我认为您需要以下内容:

val maxVersionByExternalID = myTableEntries
 .groupBy(x => x.externalID)
 .map { 
   case (externalID, group) => 
     (externalID, group.map(_.version).max)
//We have the pair of ids and max versions _not yet run_ so we can join
val resulting = (myTableEntries join maxVersionByExternalID on (
    (entries, maxPair) => //join condition
       entries.externalID === maxPair._1 && entries.version === maxPair._2))
  .map{case (entries, maxPair) => entries}//keep only the original
  .run //materialize at the end

【讨论】:

  • 这是什么结果??
  • 我不确定我是否理解您的问题。这与您在原始问题中所写的相同,这将是您正在寻找的查询结果。唯一的区别,这里我也有.run。也许您的意图是进一步加入?
  • 我正在使用 Slick 2.1.0,我的 IDE 抱怨条目和 maxPair 无法解析
  • 对不起,我错过了连接周围的两个括号。希望这样会奏效。
  • 这当然是一个不平凡的工具。答案对您的问题有用吗?我误解了你的问题吗?还是还有什么问题? (我没有尝试编译。)
【解决方案2】:

我没有在 Slick 上工作过,但是看着 scala 代码和您的要求,我想到了下面提到的问题。

解决您的问题的另一种方法是使用 SQL 中的排名函数在您的情况下为组内的每条记录提供排名,在您的情况下为 externalID 并在您的情况下排名高于版本 .

完成后,您可以选择所有排名为 1 的记录

请参考以下问题,了解如何解决此类情况。

Spark two level aggregation

【讨论】:

  • 我无法理解!似乎与我想做的事情不同!
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 2018-07-10
  • 2020-12-19
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多