Postgres RANK () с ts_rank () возвращает одинаковый ранг для всех строк - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь вернуть только первые N результатов для запроса, который использует ts_rank (). Я не знаю, какой будет N для каждого запроса, поэтому я не могу ORDER BY Score DESC LIMIT X, потому что я не знаю, какой будет X.

В моем текущем подходе я использую rank () в сочетании с ts_ranking, и в результате ранжирование всегда одинаково. Как я могу получить разные ранги, основываясь на счете, возвращенном ts_ranking? Здесь должны быть две рейтинговые группы из трех имен: 1 и 2 (на основе показанного балла).

SELECT rank_filter.* FROM (
    SELECT 
        name, 
        ts_rank(textsearchable_index_col, keywords) as score,
        rank() OVER (
            PARTITION BY ts_rank(textsearchable_index_col, keywords)
        ) as ranking
    FROM organization, to_tsquery('english', 'Obviously') keywords
    WHERE keywords @@ textsearchable_index_col ORDER BY score DESC
) as rank_filter;

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

Желаемый результат будет следующим:

         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

1 Ответ

0 голосов
/ 10 мая 2018

Вы хотите заменить PARTITION BY на ORDER BY, а также использовать dense_rank вместо rank. Следующее должно работать для желаемых результатов:

SELECT rank_filter.* FROM (
    SELECT 
        name, 
        ts_rank(textsearchable_index_col, keywords) as score,
        dense_rank() OVER (
            ORDER BY ts_rank(textsearchable_index_col, keywords) DESC
        ) as ranking
    FROM organization, to_tsquery('english', 'Obviously') keywords
    WHERE keywords @@ textsearchable_index_col ORDER BY score DESC
) as rank_filter;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...