1

質問があります:

select substr(name,7,50) as location, points,sum(if (p1=r1,10,-10))as total from
dq.data 
group by points,location order by location,total desc

このデータを生成するもの:

FRANCE  |0|2|0|0|0|0|1  110.0    
FRANCE  |0|2|1|0|1|2|1  100.0    
FRANCE  |0|2|0|0|0|1|1  100.0    
FRANCE  |0|2|1|0|0|1|1  100.0    
FRANCE  |0|2|0|1|1|2|1  100.0    
FRANCE  |0|2|0|0|1|1|1  100.0
GERMANY |1|0|2|2|2|1|0  120.0    
GERMANY |1|0|2|2|2|0|0  110.0    
GERMANY |1|0|2|2|2|2|0  110.0    
GERMANY |1|0|2|2|2|0|2  110.0    
GERMANY |1|0|2|2|2|1|1  110.0

私は最高になりたいとそれぞれtotalに関連しています。pointslocation

私は最終的に:

FRANCE  |0|2|0|0|0|0|1  110.0
GERMANY |1|0|2|2|2|1|0  120.0

サブクエリとを使用する必要があると思いますが、MAX(total)これを機能させることはできません。サブクエリで、を選択したいのですpointsが、明らかに許可されていないグループ化はしたくありません。

どうすればこれを行うことができますか?

4

2 に答える 2

3

あなたの本能は正しいです。これを行うには、最大合計を計算してから、これを元のデータに結合します。

select t.*
from (select substr(name,7,50) as location, points,sum(if (p1=r1,10,-10))as total
      from dq.data 
      group by points,location
     ) t join
     (select location, max(total) as maxtotal
      from (select substr(name,7,50) as location, points,sum(if (p1=r1,10,-10))as total
            from dq.data 
            group by points,location
           ) t
      group by location
     ) tsum
     on t.location = tsum.location and t.total = tsum.maxtotal

上部に同点がある場合、このバージョンは重複を返すことに注意してください。

私はgoogle-biggqueryに精通していません。「with」ステートメントをサポートしている場合は、次のようにしてクエリを簡略化できます。

with t as (select substr(name,7,50) as location, points,sum(if (p1=r1,10,-10))as total
           from dq.data 
           group by points,location
          )
select t.*
from t join
     (select location, max(total) as maxtotal
      from t
      group by location
     ) tsum
     on t.location = tsum.location and t.total = tsum.maxtotal

Windows関数(row_number()など)をサポートしている場合は、明示的結合を完全に削除できます。

于 2012-06-21T15:33:15.750 に答える
0

最近同様の問題があり、次のように解決しました。

SELECT substr(name,7,50) as location, points,sum(if (p1=r1,10,-10))as total
FROM ( 
   SELECT * FROM dq.data ORDER BY location,sum(if (p1=r1,10,-10)) desc 
) tmp
GROUP BY points,location;

私のデータベースはMySQLだったのでうまくいくかどうかはわかりませんが、直感的な解決策です. サマリー行が表示されないように、サブクエリを並べ替えます。

于 2012-06-21T15:39:02.323 に答える