根据 PostgreSQL 中的数字列值对每组行进行排名

Rank rows per group based on numeric column values in PostgreSQL

我在 PostgreSQL 11.0

中关注 table
drug_id        synonym                          score
96165807064    chembl490421                     0.667
96165807064    querciformolide a                1.0
96165807064    querciformolide b                1.0
96165807066    chembl196832                     1.0
96165807066    cpiylcsbeicghy-uhfffaoysa-n      0.875
96165807066    schembl1752046                   0.938
96165807066    stk694847                        0.75
96165807066    molport-006-827-808              0.812
96165807066    akos016348681                    0.625
96165807066    akos004112738                    0.688
96165807066    mcule-5237395512                 0.562

我想根据得分列添加一个 'rank' 分组 drug_id 的列。

以下是预期输出

drug_id        synonym                          score          rank
96165807064    querciformolide a                1.0            1
96165807064    querciformolide b                1.0            1
96165807064    chembl490421                     0.667          2
96165807066    chembl196832                     1.0            1
96165807066    schembl1752046                   0.938          2
96165807066    cpiylcsbeicghy-uhfffaoysa-n      0.875          3
96165807066    molport-006-827-808              0.812          4
96165807066    stk694847                        0.75           5
96165807066    akos004112738                    0.688          6
96165807066    akos016348681                    0.625          7
96165807066    mcule-5237395512                 0.562          8

我正在使用以下查询:

SELECT distinct
    drug_id,
    synonym,
    score,
    dense_RANK () OVER ( 
                PARTITION BY drug_id
        ORDER BY score
    ) rank_number
FROM
    tbl
order by drug_id, score desc
;

我使用上述查询没有得到预期的输出。

drug_id         synonym                       score      rank_number
96165807064 querciformolide a                 1.0        2
96165807064    querciformolide b              1.0        2
96165807064 chembl490421                      0.667      1
96165807066 chembl196832                      1.0        15
96165807066 schembl1752046                    0.938      14
96165807066 cpiylcsbeicghy-uhfffaoysa-n       0.875      13
96165807066 molport-006-827-808               0.812      12
96165807066 stk694847                         0.75       11
96165807066 akos004112738                     0.688      10
96165807066 akos016348681                     0.625      9
96165807066 mcule-5237395512                  0.562      8

您可以使用以下查询:

SELECT
    t.drug_id,
    t.synonym,
    t.score,
    DENSE_RANK() OVER (
        PARTITION BY t.drug_id
        ORDER BY t.drug_id, t.score desc
    ) rank
FROM
    test t;

我创建了一个 sql fiddle 来显示查询有效。

https://www.db-fiddle.com/f/p9ANUghi8TxLgXrhUHsUaY/3