按光滑(scala)中的可选列分组

时间:2016-11-13 15:52:22

标签: scala group-by left-join slick

如何按左连接表中的列进行分组?我需要做这样的事情:

val query = (for {
  (region, item)
    <- regionsTable.joinLeft(itemsTable).on(_.regionId === _.regionId)
} yield (region, item))
  .groupBy({
    case (region, item) => (region.regionId, item.createdAt)
  })

但此代码无效,因为value createdAt is not a member of slick.lifted.Rep...即使createdAt(即整个item)为NULL,也可以按这些字段进行分组?

1 个答案:

答案 0 :(得分:0)

我建议这样的事情:

val query = (for {
  (region, item)
    <- regionsTable.joinLeft(itemsTable).on(_.regionId === _.regionId)
} yield (region, item))
  .groupBy({
    case (region, item) => (region.regionId, item.map(_.createdAt))
})

我在groupBy 中添加了item.map(_.createdAt)

但这不起作用(虽然它会编译),因为你需要添加一些投影(这就是group by在SQL中的工作原理 - 你可以在你的投影中得到group by或/的列和聚合值。

更改它的最简单方法就是这样(虽然您应该添加所需的投影,可能需要一些聚合):

val query = (for {
  (region, item)
    <- regionsTable.joinLeft(itemsTable).on(_.regionId === _.regionId)
} yield (region, item))
  .groupBy{
    case (region, item) => (region.regionId, item.map(_.createdAt))
}.map { ((regionId, createdAt), _) =>
   (regionId, createdAt)
}

我在map之后添加了groupBy