加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 18:08:05 所属栏目:百科 来源:网络整理
导读:我有一张表,我希望能够提供“排名为Y的Y”数据.特别是,我希望能够以相对有效的方式呈现单个行的数据(即,不选择表中的每一行).排名本身很简单,它是表中单个列的直接ORDER BY. Postgres似乎在这方面提出了一些独特的挑战; AFAICT它没有RANK或ROW_NUMBER或等效
我有一张表,我希望能够提供“排名为Y的Y”数据.特别是,我希望能够以相对有效的方式呈现单个行的数据(即,不选择表中的每一行).排名本身很简单,它是表中单个列的直接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,这似乎是对DB活动的过多每次排名需要更新时触发).

我错过了一些明显的东西吗什么是正确的方法呢?

编辑:显然我不够清楚.我知道OFFSET / LIMIT,但我不知道它如何帮助解决这个问题.我不是要选择排序第X的项目,我试图选择一个任意项目(通过它的PK,比如说),然后能够向用户显示类似“在312中排名第43位”的内容.

如果你想要排名,可以做类似的事情
SELECT id,num,rank FROM (
  SELECT id,rank() OVER (ORDER BY num) FROM foo
) AS bar WHERE id=4

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

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

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

当然,这需要PostgreSQL 8.4.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读