Postgresql vlookup - PullRequest
       22

Postgresql vlookup

0 голосов
/ 17 июля 2009

Допустим, у меня есть таблица "uservalue" со следующими столбцами:

integer user_id
integer group_id
integer value

Я могу легко получить максимальное значение для каждой группы:

select max(value) from uservalue group by group_id;

Я хотел бы, чтобы он возвращал user_id в каждой группе, которая имела самое высокое значение. Функция max в matlab также возвращает индекс максимума, есть ли способ заставить postgresql сделать то же самое?

Ответы [ 3 ]

1 голос
/ 21 июля 2009

Похоже, вы сможете сделать это с помощью оконного запроса, например:

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, вы не будете знать, какой из них вы получите, но вы получите только одну строку для каждой группы)

1 голос
/ 17 июля 2009

Правильный способ сделать это с помощью подзапроса.

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) больше, чем все ожидаемые вами идентификаторы. Это гарантирует, что только один user_id выбран для тех же значений, а другой выбирает их обоих.

0 голосов
...