8.3的问题是.....等级在8.4中引入。
考虑数字[10,6,6,2]
我希望得到排名等于行数
的那些数字的排名Rank,score 1, 10 2,6 3,6 4,2
部分解决方案是自我加入并计算具有更高或相等分数的项目。
这会产生
1,10 3,6 3,6 4,2
这不是我想要的。
有没有办法排名,甚至只是按分数排序然后以某种方式提取行号?
答案 0 :(得分:2)
如果您希望行号等同于window function row_number(),则可以使用(临时)SEQUENCE
在版本8.3中即兴创作:
CREATE TEMP SEQUENCE foo;
SELECT nextval('foo') AS rn, *
FROM (SELECT score FROM tbl ORDER BY score DESC) s
SQL Fiddle.
在调用nextval()
之前,需要使用子选择来排序行。
注意序列(就像任何临时对象一样)......
要在每个查询之前重复运行同一会话中的序列:
SELECT setval('foo', 1, FALSE);
答案 1 :(得分:1)
有一种使用与PG 8.3一起使用的数组的方法。它可能在性能方面效率不高,但如果没有很多值,它就会好起来。
我们的想法是对临时数组中的值进行排序,然后提取数组的边界,然后将其与generate_series
连接以逐个提取值,数组中的索引是行号。
假设表格为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
答案 2 :(得分:0)
你有这张桌子的PK吗?
只需自我加入和计算项目:分数高或等和更高PK 。
PK比较将打破关系并为您提供所需的结果。
升级到9.1后 - 使用row_number()
。