我正在尝试对表中的数据子集进行排名,但我认为我做错了什么。我找不到关于postgres的rank()特性的太多信息,也许我找错地方了。无论哪种方式:
我想知道根据日期落入表的集群中的id的排名。我的疑问如下:
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。
发布于 2012-04-22 17:19:53
通过将rank()函数放在subselect中,并且没有在over子句中指定PARTITION By或在该subselect中指定任何谓词,您的查询就是在按pub_date排序的整个url_info表上生成一个排名。这可能是为什么它运行了这么长的时间来排序所有的url_info,Pg必须按照pub_date对整个表进行排序,如果表非常大,这将需要一段时间。
您似乎只想为where子句选择的那组记录生成一个排名,在这种情况下,您所需要做的就是去掉subselect,并且rank函数隐式地覆盖与该谓词匹配的那组记录。
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,你可以在该集群的过滤器中进行排名:
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;
https://stackoverflow.com/questions/10265234
复制相似问题