2013-03-03 14 views
26

voglio forzare chiazza di petrolio per creare query comeCome fare aggregazioni con chiazza di petrolio

select max(price) from coffees where ... 

Ma slick's documentation non aiuta

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 

Perché quelli Q1-Q4 non sono domande, posso ottenere i risultati ma può usarli all'interno di altre query.

Questa affermazione

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

genera domanda giusta, ma è deprecato (genera allarme: "il metodo max in ColumnExtensionMethods classe è deprecato: Usa Query.max invece"). Come generare tale query senza avvisi?

Un altro problema è quello di aggregare con il gruppo da:

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

cercato di risolvere con

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

che genera

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 

che causa evidente errore db

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

Come generare tale query?

risposta

30

Per quanto posso dire è il primo semplicemente

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

E il secondo

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

maxQuery.list 

o

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

maxQuery.list 
+4

invece di '.list.head' voi posso fare '.first', IIRC –

+0

Grazie, l'ho cambiato nella risposta – EECOLOR

+0

Grazie, entrambi gli esempi funzionano, secondo genera query ottimale "seleziona x2". COF_NAME ", max (x2." PREZZO ") da" caffè "x2 gruppo per x2." COF_NAME "", ma il primo genera "seleziona x2.x3 da (seleziona max (x4. x5) come x3 da (selezionare x6. "PREZZO" come x5 da "caffè" x6) x4) x2 "- query con 2 sottoquery anziché semplice" selezionare max (x2. "PREZZO") da "caffè" x2 "che è generato da API deprecata. Sembra che gli sviluppatori chiari abbiano deprecato questa api troppo presto. – Jeriho

Problemi correlati