Reputation: 3418
The issue with 8.3 is that rank()
is introduced in 8.4.
Consider the numbers [10,6,6,2].
I wish to achieve a rank of those numbers where the rank is equal to the row number:
rank | score
-----+------
1 | 10
2 | 6
3 | 6
4 | 2
A partial solution is to self-join and count items with a higher or equal, score. This produces:
1 | 10
3 | 6
3 | 6
4 | 2
But that's not what I want.
Is there a way to rank, or even just order by score somehow and then extract that row number?
Upvotes: 0
Views: 1042
Reputation: 656724
If you want a row number equivalent to the window function row_number()
, you can improvise in version 8.3 (or any version) with a (temporary) SEQUENCE
:
CREATE TEMP SEQUENCE foo;
SELECT nextval('foo') AS rn, *
FROM (SELECT score FROM tbl ORDER BY score DESC) s;
The subquery is necessary to order rows before calling nextval()
.
Note that the sequence (like any temporary object) ...
To use the sequence in the same session repeatedly run before each query:
SELECT setval('foo', 1, FALSE);
Upvotes: 2
Reputation: 61526
There's a method using an array that works with PG 8.3. It's probably not very efficient, performance-wise, but will do OK if there aren't a lot of values.
The idea is to sort the values in a temporary array, then extract the bounds of the array, then join that with generate_series
to extract the values one by one, the index into the array being the row number.
Sample query assuming the table is scores(value int)
:
SELECT i AS row_number,arr[i] AS score
FROM (SELECT arr,generate_series(1,nb) AS i
FROM (SELECT arr,array_upper(arr,1) AS nb
FROM (SELECT array(SELECT value FROM scores ORDER BY value DESC) AS arr
) AS s2
) AS s1
) AS s0
Upvotes: 1
Reputation: 28541
Do you have a PK for this table?
Just self join and count items with: a higher or equal score and higher PK.
PK comparison will break ties and give you desired result.
And after you upgrade to 9.1 - use row_number()
.
Upvotes: 0