假设我有一个表“uservalue”,其中包含以下列:
integer user_id
integer group_id
integer value
我可以轻松获得每个组的最大值:
select max(value) from uservalue group by group_id;
我想要的是返回每个具有最高值的组中的user_id。 matlab中的max函数也会返回最大的索引,有没有办法让postgresql做同样的事情?
答案 0 :(得分:1)
正确的方法是使用子查询。
select
u.user_id,
u.value
from
uservalue u
join
(select groupid, max(value) as max_value from uservalue group by group_id) mv
on u.value = mv.max_value and mv.group_id = u.group_id
但是我有时候更喜欢简单的黑客攻击。
select max(value*100000 + user_id) - 100000, max(value) from user_value group by group_id
确保数字(100000)高于您期望拥有的任何用户ID。这样可确保在相同的值上只选择一个user_id,而另一个选择它们。
答案 1 :(得分:1)
似乎你应该可以通过窗口查询来执行此操作,例如:
SELECT DISTINCT
group_id,
first_value(user_id) OVER w AS user,
first_value(value) OVER w AS val
FROM
uservalue
WINDOW w AS (PARTITION BY group_id ORDER BY value DESC)
如果您有多个具有相同值的用户,此查询也将起作用(除非您向ORDER BY添加第二列,但您不知道将返回哪一个 - 但每组只返回一行)
答案 2 :(得分:0)