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