我有一张表,我希望能够为其呈现“Y 中排名 X”的数据。特别是,我希望能够以相对有效的方式呈现单个行的数据(即不选择表中的每一行)。排名本身非常简单,它是表中单个列的直接 ORDER BY。
Postgres 似乎在这方面提出了一些独特的挑战。AFAICT 它没有 RANK 或 ROW_NUMBER 或等效功能(至少在 8.3 中,我暂时坚持使用它)。邮件列表档案中的规范答案似乎是创建一个临时序列并从中选择:
test=> create temporary sequence tmp_seq;
CREATE SEQUENCE
test=*> select nextval('tmp_seq') as row_number, col1, col2 from foo;
当我只想从表中选择一行时(并且我想按 PK 选择它,而不是按排名),这个解决方案似乎仍然无济于事。
我可以将排名非规范化并将其存储在单独的列中,这使得呈现数据变得微不足道,但只是重新定位了我的问题。UPDATE 不支持 ORDER BY,所以我不确定如何构建一个 UPDATE 查询来设置排名(没有选择每一行并为每一行运行一个单独的 UPDATE,这似乎太多的数据库活动每次队伍需要更新时触发)。
我错过了一些明显的东西吗?这样做的正确方法是什么?
编辑:显然我不够清楚。我知道 OFFSET/LIMIT,但我不明白它如何帮助解决这个问题。我不是想选择排名第 X 的项目,而是尝试选择任意项目(例如,通过其 PK),然后能够向用户显示“在 312 中排名第 43”之类的内容。