给出下表
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
如何只选择这些行?
我尝试摆弄UNIQUE
,MAX(category_id)
等,但我仍然无法获得正确的结果。对我来说,主要的问题是在这里得到category_name_plus
值。
我正在使用PostgreSQL 9.4(beta 3),因为我还需要其他各种细节,例如"WITH ORDINALITY"
等。
答案 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