Re: Rank - Mailing list pgsql-sql

From Martin Knipper
Subject Re: Rank
Date
Msg-id 4097B34B.7070102@mk-os.de
Whole thread Raw
In response to Re: Rank  (george young <gry@ll.mit.edu>)
Responses Re: Rank
List 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 by date:

Previous
From: Martin Knipper
Date:
Subject: Re: typecasting numeric(18,4) to varchar/text
Next
From: "Alain Reymond"
Date:
Subject: Re: Database structure