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

问题描述

我在Postgresql 11.0中有下表

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

我想在分数列的基础上添加一个带有drug_id'rank'group的列。

以下是预期的输出

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小提琴来显示查询的工作状态。

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