首页 文章

如何使用光滑进行聚合

提问于
浏览
27

我想强制光滑创建像

select max(price) from coffees where ...

slick's documentation没有帮助

val q = Coffees.map(_.price) //this is query Query[Coffees.type, ...]
val q1 = q.min // this is Column[Option[Double]]
val q2 = q.max
val q3 = q.sum
val q4 = q.avg

因为那些q1-q4不是查询,我无法获得结果,但可以在其他查询中使用它们 .

这个说法

for {
  coffee <- Coffees
} yield coffee.price.max

生成正确的查询但不推荐使用(生成警告:" method max in class ColumnExtensionMethods is deprecated: Use Query.max instead") . How to generate such query without warnings?

另一个问题是通过以下方式聚合:

"select name, max(price) from coffees group by name"

试图解决它

for {
  coffee <- Coffees
} yield (coffee.name, coffee.price.max)).groupBy(x => x._1)

产生

select x2.x3, x2.x3, x2.x4 from (select x5."COF_NAME" as x3, max(x5."PRICE") as x4 from "coffees" x5) x2 group by x2.x3

这会导致明显的db错误

column "x5.COF_NAME" must appear in the GROUP BY clause or be used in an aggregate function

How to generate such query?

1 回答

  • 31

    据我所知,第一个就是简单

    Query(Coffees.map(_.price).max).first
    

    第二个

    val maxQuery = Coffees
      .groupBy { _.name }
      .map { case (name, c) =>
        name -> c.map(_.price).max
      }
    
    maxQuery.list
    

    要么

    val maxQuery = for {
      (name, c) <- Coffees groupBy (_.name)
    } yield name -> c.map(_.price).max
    
    maxQuery.list
    

相关问题