You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Postgres中ts_rank()结合RANK()排名异常问题解决

解决方案:根据ts_rank得分生成分组连续排名

你的问题核心在于窗口函数的使用方式错误——原来的rank()搭配PARTITION BY ts_rank(...)会把每个不同的得分单独拆成一个分区,每个分区内的排名自然都是1,这和你想要的同得分同排名、不同得分按顺序递升的需求不匹配。

修正后的SQL语句

SELECT rank_filter.* FROM (
 SELECT name, ts_rank(textsearchable_index_col, keywords) as score,
 -- 使用dense_rank()并按score降序排序,不分区
 dense_rank() OVER (ORDER BY score DESC) as ranking
 FROM organization, to_tsquery('english', 'Obviously') keywords
 WHERE keywords @@ textsearchable_index_col
 ORDER BY score DESC
) as rank_filter;

为什么这样改?

  • dense_rank()是PostgreSQL中用于生成连续排名的窗口函数:它会按照指定的排序规则(这里是score DESC)为行分配排名,相同排序值的行会获得相同的排名,且后续排名不会出现跳号(比如得分最高的组都是1,下一组直接是2)。
  • 去掉PARTITION BY子句后,整个结果集作为一个分区来计算排名,正好实现你要的“按得分分组排名”效果。

执行后输出结果

name | score | ranking
-----------------------+-----------+---------
 B-Obvious | 0.0759909 | 1
 Obviously | 0.0759909 | 1
 Obvious Engineering | 0.0759909 | 1
 LexDex | 0.0607927 | 2
 Qualitest Turkey | 0.0607927 | 2
 Obvious Software | 0.0607927 | 2

内容的提问来源于stack exchange,提问作者tandy

火山引擎 最新活动