我应该如何处理 PostgreSQL 中的“从 y 中排名 x”数据?

2023-11-25

我有一个表格,我希望能够呈现“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,这似乎需要太多的数据库活动每次排名需要更新时触发)。

我错过了一些明显的事情吗?这样做的正确方法是什么?

EDIT: 看来我说得不够清楚。我知道 OFFSET/LIMIT,但我不知道它如何帮助解决这个问题。我不是试图选择排名第 X 的项目,而是尝试选择任意项目(例如,通过其 PK),然后能够向用户显示诸如“在 312 个项目中排名第 43 位”之类的内容。


如果你想要排名,请执行以下操作

SELECT id,num,rank FROM (
  SELECT id,num,rank() OVER (ORDER BY num) FROM foo
) AS bar WHERE id=4

或者,如果您确实想要行号,请使用

SELECT id,num,row_number FROM (
  SELECT id,num,row_number() OVER (ORDER BY num) FROM foo
) AS bar WHERE id=4

当你在某个地方有相同的值时,它们会有所不同。如果您需要的话,还有dense_rank()。

当然,这需要 PostgreSQL 8.4。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何处理 PostgreSQL 中的“从 y 中排名 x”数据? 的相关文章

随机推荐