2013-03-03 126 views
26

如何使聚合我想迫使光滑像用油滑

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 

產生正確的查詢,但不建議(產生的警告: 「在課堂上ColumnExtensionMethods方法Max已經過時:使用Query.max而不是」)。 如何在沒有警告的情況下生成這樣的查詢?

的另一個問題是通過用組聚集:

"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 

這會導致明顯的分貝錯誤來解決它

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

如何生成這樣的查詢?

回答

30

至於我可以告訴是第一個簡單的

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 
+4

,而不是'.list.head'你可以做'.first',IIRC – 2013-03-04 10:41:35

+0

謝謝,我在回答中更改了 – EECOLOR 2013-03-04 11:43:56

+0

謝謝,這兩個例子都工作,第二生成最佳查詢「,從」coffees「x2組中選擇x2。」COF_NAME「,max(x2。」PRICE「)x2。」COF_NAME「」,但第一個生成「select x2.x3 from(select max(x4。 (選擇x6。「PRICE」as x5 from「coffees」x6)x4)x2「 - 用2個子查詢進行查詢而不是簡單的」select「max(x2。」PRICE「)from」coffees「x2」由不推薦的api生成。看起來,華而不實的開發人員過早地棄用了這個API。 – Jeriho 2013-03-04 20:40:37