2017-11-14 4 views
0

SlickでいくつかのSQLクエリを構築しています。私はいくつかのネストされたクエリでこのクエリを持っており、私はどのように1つにすべてを組み合わせるかを理解することはできません。集計関数を使用したネストされたクエリSlick

私のSQLクエリ:スリックとこのクエリの

select count(*) from (

    select TOP 1 WITH TIES sum(c) cc, c1, c2 from (

    SELECT count(*) c, town_from c1, town_to c2 from trip 
    where town_from>=town_to 
    group by town_from, town_to 
    union all 
    SELECT count(*) c,town_to, town_from from trip 
    where town_to>town_from 
    group by town_from, town_to 
    ) as t 

    group by c1,c2 
    order by cc desc 

    ) as tt 

私の未完成版:

val subquery1 = TripTable.table.filter(t => t.townFrom >= t.townTo) 
     .groupBy(t => (t.townFrom, t.townTo)) 
     .map{ case ((townFrom, townTo), group) => (group.length ,townFrom, townTo)} 
val subquery2 = TripTable.table.filter(t => t.townTo > t.townFrom) 
     .groupBy(t => (t.townFrom, t.townTo)) 
     .map{ case ((townFrom, townTo), group) => (group.length ,townFrom, townTo)} 

    val t = subquery1 union subquery2 
val tt = t.map{ case subquery1 => (subquery1._1, subquery1._2, subquery1._3) } 
       .groupBy{case (sub1, sub2, sub3) => (sub2, sub3)} 
        .map{ case ((sub1,sub2, sub3), group) => (group.map(_._1).sum.get, sub2, sub3)} 
         .sortBy{ case (sum, sub2, sub3) => sum} 
         .take(1) 
db.run(tt.length.result) 

私は助けの任意の種類のために非常に感謝されます!

答えて

1

このクエリは、私の仕事:

val subquery1 = TripTable.table.filter(t => t.townFrom >= t.townTo) 
     .groupBy(t => (t.townFrom, t.townTo)) 
     .map{ case ((townFrom, townTo), group) => (group.length, townFrom, townTo)} 

    val subquery2 = TripTable.table.filter(t => t.townTo > t.townFrom) 
     .groupBy(t => (t.townFrom, t.townTo)) 
     .map{ case ((townFrom, townTo), group) => (group.length, townFrom, townTo)} 

    val t = subquery1 union subquery2 
    val tt = t.map { case subquery1 => (subquery1._1, subquery1._2, subquery1._3) } 
     .groupBy { case (sub1, sub2, sub3) => (sub2, sub3) } 
     .map { case ((sub2, sub3), group) => (group.map(_._1).sum, sub2, sub3) } 
     .sortBy { case (sum, sub2, sub3) => sum } 
          .take(1) 
    println(tt.length.result.statements) 
関連する問題