0

假设我有一个包含以下列的表“uservalue”:

integer user_id
integer group_id
integer value

我可以轻松获得每个组的最大值:

select max(value) from uservalue group by group_id;

我想要的是它返回每个组中具有最高值的 user_id。matlab中的max函数也会返回最大值的索引,有没有办法让postgresql做同样的事情?

4

3 回答 3

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

但是,我有时更喜欢更简单的 hack。

select max(value*100000 + user_id) - 100000, max(value) from user_value group by group_id

确保该数字 (100000) 高于您期望拥有的任何用户 ID。这样可以确保在相同的值上只选择一个 user_id,而另一个同时选择它们。

于 2009-07-16T21:25:33.653 回答
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 添加第二列,但您将不知道您将返回哪一列 - 但每个组只能返回一行)

于 2009-07-21T07:40:44.813 回答
0

这里有几种方法可以做到这一点。

这几乎是一个常见问题解答。

于 2010-01-27T13:06:38.670 回答