2013-03-03 9 views
26

möchte ich glatt zwingen, Abfragen zu erstellen wieWie man Aggregationen mit Slick

select max(price) from coffees where ... 

Aber slick's documentation nicht

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 

hilft Weil die q1-q4 nicht Abfragen sind, kann ich bekomme die Ergebnisse nicht, kann sie aber in anderen Abfragen verwenden.

Diese Aussage

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

erzeugt richtige Abfrage aber ist veraltet (erzeugt Warnung: "Methode max in der Klasse ColumnExtensionMethods veraltet ist: Verwenden Sie Query.max statt"). Wie generiert man eine solche Abfrage ohne Warnungen?

Ein weiteres Problem ist mit der Gruppe zum Aggregieren von:

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

versucht, es zu lösen, mit

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

die

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 

erzeugt, die

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

Wie generiert man solche Abfragen?

Antwort

30

Soweit ich die erste ist einfach

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

Und die zweite

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

maxQuery.list 

oder

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

maxQuery.list 
+4

statt '.list.head' man kann sagen, kann '.first', IIRC –

+0

Dank, änderte ich es in der Antwort – EECOLOR

+0

Danke, beide Beispiele arbeiten, Sekunde generiert optimale Abfrage "wählen x2." COF_NAME ", max (x2." PREIS ") von" Kaffees "x2 Gruppe von x2." COF_NAME "", aber der erste erzeugt "wählen x2.x3 von (wählen Sie max (x4. x5) als x3 von (wählen x6. "PREIS" als x5 von "Kaffee" x6) x4) x2 "- Abfrage mit 2 Unterabfragen statt einfach" wählen Sie max (x2. "PREIS") von "Kaffees" x2 "das ist generiert von veraltetem API. Es scheint, dass glatte Entwickler diese API zu früh veraltet haben. – Jeriho