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

ISHIDA Akio iakio @ mono-space.net
2006年 8月 18日 (金) 02:46:50 JST


こんにちは。石田@苫小牧市です。

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 メーリングリストの案内