如何在Postgres查询中排序?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (92)

我试图在表格中排列数据的一个子集,但我认为我做错了什么。我找不到关于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;

我认为我做错了什么的原因是url_info中只有39行是在cluster_id 9876中,并且此查询运行了10分钟,并且从未返回。(实际上重新运行它一段时间,它没有返回任何结果,但是在集群9876中有一行id为1234)我期待这会告诉我类似于“id 1234是第五个给定的标准”)。会根据我的查询约束返回相对的等级,对吗?

这是postgres 8.4。

提问于
用户回答回答于

通过在子查询中放置rank()函数,并且不在over子句或该子查询中的任何谓词中指定PARTITION BY,则查询会要求在由pub_date排序的整个url_info表上生成一个排名。这可能是为什么它运行时间超过url_info的所有值,Pg必须通过pub_date对整个表进行排序,如果表非常大,则需要一段时间。

看起来你想为where子句中选择的记录集生成一个排名,在这种情况下,你所需要做的就是消除子选择,并且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;
用户回答回答于

共享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()计算学生的排名:

;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)

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励