在PostgreSQL 8.3中实现总订单排名

时间:2013-01-25 13:23:18

标签: sql postgresql rank postgresql-8.3

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

这不是我想要的。

有没有办法排名,甚至只是按分数排序然后以某种方式提取行号?

3 个答案:

答案 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()