[pgsql-jp: 37427] Re: 一部のデータを SELECT した際に全体の順位取得

whi te white_wwjd @ yahoo.co.jp
2006年 8月 18日 (金) 15:04:34 JST


こんにちは。
ずいぶん遅くまで起きていらっしゃいますね
私は(-.-)Zzzzz....

石田さんが示して下さった構文を元に実環境のデータに
当てはめてみた所問題なく順位を出すことが出来ました。
ご協力頂いた方、本当にありがとうございました。



-----------sampleデータ------------

server=# SELECT * from test ;
 name | points
------+--------
 aa   |     60
 bb   |     80
 cc   |     70
 dd   |     40
 ee   |     20
 aa   |     10
 bb   |     30
 cc   |      5
 aa   |      5
(9 rows)

SELECT r1.name,r1.points_sum, count(r2.*)+1 as rank
FROM
(SELECT name, sum(points) AS points_sum
  FROM test
 GROUP BY name ) AS r1 
LEFT JOIN
(SELECT name, sum(points) AS points_sum
  FROM test
 GROUP BY name ) AS r2
ON r1.points_sum < r2.points_sum
GROUP BY r1.name, r1.points_sum
ORDER BY rank;
 name | points_sum | rank
------+------------+------
 bb   |        110 |    1
 cc   |         75 |    2
 aa   |         75 |    2
 dd   |         40 |    4
 ee   |         20 |    5
(5 rows)





> こんにちは。石田@苫小牧市です。
> 
> 06/08/17 に whi te<white_wwjd @ yahoo.co.jp> さんは書き
ました:
> > ご返信ありがとうございます。
> >
> > > 順位 =(自分より大きい points の人の数+1)と考
える
> > と、
> >
> > なるほど。
> > 確かに順位ってそういう事ですね。
> > 順位の意味(!?)を考えてみた事なかったですが、
> > そういう風に考え直すと、SQL文が作成出来ますね。
> > 勉強になりました。
> >
> > ただ、実際のデータってランキングテーブルに
> > 同一人物のデータが複数存在します。
> > ですので、例示して頂いたSQLを基に以下の様なSQL文を作
成し
> > てみたのですが、エラーが出てしまいます。
> >
> > COUNT/SUMしたデータを条件文に含む事は出来ないのでし
ょう
> > か。
> > ON句のSUMを試しに抜かしてみると、結果は違いますが、
> > SQLはとおります。
> >
> > SELECT r1.name,r1.points,SUM(r2.points)+1 as rank
> > FROM ランキング r1 LEFT JOIN ランキング r2 ON
> > SUM(r1.points) < SUM(r2.points)
> > GROUP BY r1.name,r1.points,r2.points
> > ORDER BY rank DESC
> >
> > ERROR:  aggregates not allowed in JOIN conditions
> 
> エラーの直接の原因はエラーメッセージの通り、JOINの条件
式には
> 集約関数を使うことができないということです。
> 
> しかし、藤田さんのやりたいことは「合計してから順位を求
める」
> ということだと思います。FROM句はSUMなどよりも先に評価
> されるので、サブクエリに入れる必要があります。
> 試してませんが、多分こんな感じだと思います。
> 
> SELECT r1.name,r1.points_sum, count(r2.*)+1 as rank
> FROM
> (SELECT name, sum(points) AS points_sum
>   FROM ランキング
>  GROUP BY name ) AS r1
> LEFT JOIN
> (SELECT name, sum(points) AS points_sum
>   FROM ランキング
>  GROUP BY name ) AS r2
> ON r1.points < r2.points
> GROUP BY r1.name,r1.points
> ORDER BY rank
> 
> 
> -- 
> ISHIDA Akio <iakio @ mono-space.net/ishida @ cycleof5th.com>




pgsql-jp メーリングリストの案内