Это может сработать:
SELECT id, country, sex, value AS maxvalue FROM (
SELECT u.id, u.country, u.sex, COALESCE(t.value, 0) AS value
, ROW_NUMBER() OVER ( PARTITION BY u.country ORDER BY t.value DESC NULLS LAST ) AS rn
FROM users u LEFT JOIN transactions t
ON u.id = t.id
) WHERE rn = 1;
Это позволит получить все значения для каждой страны и ранжировать их, а затем получить только то, которое имеет самый высокий ранг. Если вы также хотите получить галстуки, используйте RANK()
вместо ROW_NUMBER()
:
SELECT id, country, sex, value AS maxvalue FROM (
SELECT u.id, u.country, u.sex, COALESCE(t.value, 0) AS value
, RANK() OVER ( PARTITION BY u.country ORDER BY t.value DESC NULLS LAST ) AS rn
FROM users u LEFT JOIN transactions t
ON u.id = t.id
) WHERE rn = 1;
Надеюсь, это поможет.