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

whi te white_wwjd @ yahoo.co.jp
2006年 8月 17日 (木) 21:58:10 JST


ご返信ありがとうございます。

> 順位 =(自分より大きい 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





> 賀内と申します。
> 
> > TABLE名:ランキング
> > 
> > name|points
> > -----------
> > aa  |60
> > bb  |80
> > cc  |70
> > dd  |40
> > ee  |20
> > 
> > 
> > SELECT * FROM ランキング OFFSET 2 LIMIT 2 ORDER BY
points
> > DESC;
> > 
> > name|points
> > aa  |60
> > dd  |40
> > 
> > が取得されると思いますが、「aa」が全体の何位かを取得
する
> > 事は出来ないでしょうか。
> > 以下の様に取得するのが理想です。
> > 
> > name|points|rank
> > aa  |60    |3
> > dd  |40    |4
> 
> 順位 =(自分より大きい points の人の数+1)と考える
と、
> 
>  SELECT r1.name,r1.points,count(r2.*)+1 as rank
>  FROM ランキング r1 LEFT JOIN ランキング r2 ON r1.points
< r2.points
>  GROUP BY r1.name,r1.points
>  ORDER BY rank
> 
> と書けますよ。
> これだと OFFSET / LIMIT も使えるし、同じ points の人が
いても大丈夫です。
> 



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