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




