29

我正在尝试对表中的数据子集进行排名,但我认为我做错了。我找不到有关 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

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

这是 postgres 8.4 顺便说一句。

4

2 回答 2

42

通过将 rank() 函数放在子选择中,而不在 over 子句中指定 PARTITION BY 或在该子选择中指定任何谓词,您的查询要求对 pub_date 排序的整个 url_info 表产生排名。这可能就是为什么它运行这么久才能对所有 url_info 进行排序,Pg 必须按 pub_date 对整个表进行排序,如果表非常大,这将需要一段时间。

您似乎只想为 where 子句选择的记录集生成排名,在这种情况下,您需要做的就是消除子选择,并且排名函数隐含地覆盖与该谓词匹配的记录集。

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;
于 2012-04-22T09:19:53.017 回答
8

分享另一个 PostgreSQL 的 DENSE_RANK() 例子。查找前 3 名学生示例查询。 参考来自这个博客:

使用示例数据创建一个表:

CREATE TABLE tbl_Students
(
    StudID INT
    ,StudName CHARACTER VARYING
    ,TotalMark INT
);

INSERT INTO tbl_Students 
VALUES 
(1,'Anvesh',88),(2,'Neevan',78)
,(3,'Roy',90),(4,'Mahi',88)
,(5,'Maria',81),(6,'Jenny',90);

使用 DENSE_RANK(),计算学生的 RANK:

;WITH cteStud AS
(
    SELECT 
        StudName
        ,Totalmark
        ,DENSE_RANK() OVER (ORDER BY TotalMark DESC) AS StudRank
    FROM tbl_Students
)
SELECT 
    StudName
    ,Totalmark
    ,StudRank
FROM cteStud 
WHERE StudRank <= 3;

结果:

studname | totalmark | studrank
----------+-----------+----------
 Roy      |        90 |        1
 Jenny    |        90 |        1
 Anvesh   |        88 |        2
 Mahi     |        88 |        2
 Maria    |        81 |        3
(5 rows)
于 2016-11-30T20:37:24.447 回答