根据两个字段过滤行,其中一个字段包含选择条件

时间:2014-10-13 09:48:56

标签: postgresql

给出下表

group | weight | category_id | category_name_plus
    1       10           100   Ab
    1       20           101   Bcd
    1       30           100   Efghij
    2       10           101   Bcd
    2       20           101   Cdef
    2       30           100   Defgh
    2       40           100   Ab
    3       10           102   Fghijkl
    3       20           101   Ab

"体重"对于每个组都是唯一的,也是组内记录顺序的指示符。

我想要的是检索按category_id过滤的每个组的一条记录,但只检索具有最高"权重"在其"组内"。

按category_id = 100过滤的示例:

group | weight | category_id | category_name_plus
    1       30           100   Efghij
    2       40           100   Ab

按category_id = 101过滤的示例:

group | weight | category_id | category_name_plus
    1       20           101   Bcd
    2       20           101   Cdef
    3       20           101   Ab

如何只选择这些行?

我尝试摆弄UNIQUEMAX(category_id)等,但我仍然无法获得正确的结果。对我来说,主要的问题是在这里得到category_name_plus值。

我正在使用PostgreSQL 9.4(beta 3),因为我还需要其他各种细节,例如"WITH ORDINALITY"等。

2 个答案:

答案 0 :(得分:1)

rank window function应该可以解决问题:

SELECT "group", weight, category_id, category_name_plus
FROM   (SELECT "group", weight, category_id, category_name_plus,
               RANK() OVER (PARTITION BY "group" 
                            ORDER BY weight DESC) AS rk
        FROM   my_table) t
WHERE  rk = 1 AND category_id = 101

注意:
“group”是SQL中的保留字,因此必须用引号括起来才能用作列名。但是,用非保留字替换它可能会更好,例如“group_id”。

答案 1 :(得分:1)

尝试类似:

SELECT DISTINCT ON (category_id) *
from your_table
order by category_id, weight desc