假设我有一个包含以下列的表“uservalue”:
integer user_id
integer group_id
integer value
我可以轻松获得每个组的最大值:
select max(value) from uservalue group by group_id;
我想要的是它返回每个组中具有最高值的 user_id。matlab中的max函数也会返回最大值的索引,有没有办法让postgresql做同样的事情?
假设我有一个包含以下列的表“uservalue”:
integer user_id
integer group_id
integer value
我可以轻松获得每个组的最大值:
select max(value) from uservalue group by group_id;
我想要的是它返回每个组中具有最高值的 user_id。matlab中的max函数也会返回最大值的索引,有没有办法让postgresql做同样的事情?
正确的方法是使用子查询。
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,而另一个同时选择它们。
似乎您应该能够使用窗口查询来执行此操作,例如:
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 添加第二列,但您将不知道您将返回哪一列 - 但每个组只能返回一行)