首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在postgres查询中排名

如何在postgres查询中排名
EN

Stack Overflow用户
提问于 2012-04-22 12:31:02
回答 1查看 65.5K关注 0票数 29

我正在尝试对表中的数据子集进行排名,但我认为我做错了什么。我找不到关于postgres的rank()特性的太多信息,也许我找错地方了。无论哪种方式:

我想知道根据日期落入表的集群中的id的排名。我的疑问如下:

代码语言:javascript
复制
select cluster_id,feed_id,pub_date,rank 
from (select feed_id,pub_date,cluster_id,rank() 
    over (order by pub_date asc) from url_info) 
as bar where cluster_id = 9876 and feed_id = 1234;

我根据下面的stackoverflow帖子对此进行建模:postgres rank

我认为我做错了事情的原因是,在cluster_id 9876中,url_info中只有39行,这个查询运行了10分钟,再也没有回来。(实际上重新运行了很长一段时间,它没有返回任何结果,但在集群9876中有一行对应于id 1234)我希望这会告诉我类似于"id 1234在给定的条件下是第5位“。它将根据我的查询约束返回相对排名,对吗?

这是postgres 8.4btw。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-22 17:19:53

通过将rank()函数放在subselect中,并且没有在over子句中指定PARTITION By或在该subselect中指定任何谓词,您的查询就是在按pub_date排序的整个url_info表上生成一个排名。这可能是为什么它运行了这么长的时间来排序所有的url_info,Pg必须按照pub_date对整个表进行排序,如果表非常大,这将需要一段时间。

您似乎只想为where子句选择的那组记录生成一个排名,在这种情况下,您所需要做的就是去掉subselect,并且rank函数隐式地覆盖与该谓词匹配的那组记录。

代码语言:javascript
复制
select 
  cluster_id
 ,feed_id
 ,pub_date
 ,rank() over (order by pub_date asc) as rank
from url_info
where cluster_id = 9876 and feed_id = 1234;

如果你真正想要的是集群中的排名,而不考虑feed_id,你可以在该集群的过滤器中进行排名:

代码语言:javascript
复制
select ranked.*
from (
  select 
    cluster_id
   ,feed_id
   ,pub_date
   ,rank() over (order by pub_date asc) as rank
  from url_info
  where cluster_id = 9876
) as ranked
where feed_id = 1234;
票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10265234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档