Re: Rank
| От | Martin Knipper |
|---|---|
| Тема | Re: Rank |
| Дата | |
| Msg-id | 4097B34B.7070102@mk-os.de обсуждение исходный текст |
| Ответ на | Re: Rank (george young <gry@ll.mit.edu>) |
| Ответы |
Re: Rank
|
| Список | pgsql-sql |
Am 04.05.2004 16:11 schrieb george young:
> On Sun, 2 May 2004 02:22:37 +0800
> "Muhyiddin A.M Hayat" <middink@indo.net.id> threw this fish to the penguins:
>
>>I Have below table
>>
>> id | site_name | point
>>----+-----------+-------
>> 1 | Site A | 40
>> 2 | Site B | 90
>> 3 | Site D | 22
>> 4 | Site X | 98
>>
>> Would like to calc that Rank for each site, and look like
>>
>> id | site_name | point | rank
>>----+-----------+-------+------
>> 1 | Site A | 40 | 3
>> 2 | Site B | 90 | 2
>> 3 | Site D | 22 | 4
>> 4 | Site X | 98 | 1
>
>
> Well, a simple minded solution would be:
>
> select id,site_name,point,(select count(*)from mytable t2
> where t2.point >= t1.point) as rank from mytable t1;
>
> id | site_name | point | rank
> ----+-----------+-------+------
> 4 | Site X | 98 | 1
> 2 | Site B | 90 | 2
> 1 | Site A | 40 | 3
> 3 | Site D | 22 | 4
> (4 rows)
>
> If mytable is huge this may be prohibitively slow, but it's worth a try.
> There's probably a self join that would be faster. Hmm... in fact:
>
> select t1.id,t1.site_name,t1.point,count(t2.point) as rank from mytable t1,mytable t2
> where t2.point >=t1.point group by t1.id,t1.site_name,t1.point;
>
> id | site_name | point | rank
> ----+-----------+-------+------
> 3 | Site D | 22 | 4
> 2 | Site B | 90 | 2
> 4 | Site X | 98 | 1
> 1 | Site A | 40 | 3
> (4 rows)
>
>
> -- George Young
Another possibilty is to use a sequence:
demo=# create temporary sequence ranking;
demo=# select *,nextval('ranking') as rank from yourTable order by
site_name asc;
Greetins,
Martin
--
Martin Knipper
www : http://www.mk-os.de
Mail : knipper@mk-os.de
Random Signature:
-----------------
while( !asleep() ) sheep++;
В списке pgsql-sql по дате отправления: