Выберите несколько строк с максимальной суммой значения, сгруппированного по другому столбцу

У меня есть таблица "ресурсов", которая содержит информацию о том, как ресурсы определенного веса размещаются пользователем на территории.

territory_id        user_id     weight 
1                       1           1
1                       1           4
1                       1           2
1                       2           2
2                       3           2
2                       2           3 
2                       2           3
3                       1           1
4                       1           1
4                       1           1
4                       2           2
4                       3           3
4                       3           1
4                       3           2
5                       3           2
5                       3           3
5                       2           1
4                       3           1

Я хочу рассчитать для каждой существующей территории, какой пользователь имеет наибольший общий вес ресурсов (и какова эта стоимость). Так что это должно быть ожидаемым результатом для предыдущих данных:

territory_id        best_user_id        best_user_total_weight_of_resources 
1                       1                       7 
2                       2                       6
3                       1                       1
4                       3                       6
5                       3                       5

Я уже пробовал несколько вложенных запросов с SUM, MAX, GROUP BY но я действительно не нашел правильный способ рассчитать это. Я нашел много похожих вопросов, но не решил именно эту проблему. Любая помощь? Заранее спасибо!

РЕДАКТИРОВАТЬ:

Прямо сейчас я обнаружил, что двойной GROUP BY (то есть "GROUP BY территория_ид, user_id") с двойным ORDER BY частично решает мою проблему, но он также показывает информацию, которую я не хочу (не только лучший пользователь, но и каждый из них). пользователь, который разместил хотя бы один ресурс).

SELECT territory_id, user_id AS best_user_id, SUM( weight ) AS best_user_total_weight
FROM resources
GROUP BY territory_id, user_id
ORDER BY territory_id ASC, best_user_total_weight DESC;

1 ответ

Решение

Вы можете запустить первый запрос, чтобы определить SUM(weight) для каждой пары (territory_id,user_id), а затем запустить второй SELECT запрос по этому результирующему набору для получения строки, соответствующей значению max summ:

SELECT territory_id, user_id, MAX(summ) 
FROM (
  SELECT territory_id, user_id, SUM(weight) AS summ 
  FROM resources
  GROUP BY territory_id, user_id
) AS t1 
GROUP BY territory_id
Другие вопросы по тегам