Postgresql vlookup

时间:2009-07-16 20:57:37

标签: postgresql greatest-n-per-group max vlookup

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

integer user_id
integer group_id
integer value

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

select max(value) from uservalue group by group_id;

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

3 个答案:

答案 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)