Сумма с группой в postgres

У меня есть таблица country_percent, например:

Имя страныНазвание группыпроцент_значение
НАСEMEA10.00
НАС25.00
ГБEMEA15.00
АПОдомашненный20.00
АКОдомашненный12.00
ЕС5.00

Теперь я хотел бы выбрать наибольшую сумму процентного_значения для каждой группы по стране, например:

country_namegroup_namesum_percent
НАСEMEA35.00
APDomestic20.00

поэтому здесь выбраны США, потому что сумма их процентов была самой высокой для группы EMEA. Обратите внимание, что NULL group_name засчитывается в пользу EMEA из-за совпадения country_name. Также обратите внимание, что ES не появился, так как у него не было никакого group_name против него, и нет другой группы со значением ES.

Можно ли запросить вышеуказанное с помощью Postgres?

решение ниже работает для вас?

trillion 05.05.2022 19:35
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из вашего результата вы пропускаете Испанию, потому что у нее нет группы.

Итак, вы можете сделать это так

WITH SUMCTE AS (SELECT "country_name", MAX("group_name") as group_name, SUM("percent_value") AS percent_value
FROM tab1
GROUP BY "country_name"),
CTE_ROW_NUM AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY "group_name" ORDER BY "percent_value" DESC ) rn 
FROM SUMCTE
WHERE "group_name" IS NOT NULL)
SELECT "country_name", "group_name", "percent_value"
FROM CTE_ROW_NUM
WHERE rn = 1
ORDER BY  "percent_value" DESC
country_name | group_name | percent_value
:----------- | :--------- | ------------:
US           | EMEA       |         35.00
AP           | Domestic   |         20.00

дб <> рабочий пример здесь

ПРИМЕРНЫЕ ДАННЫЕ РЕЗУЛЬТАТЫ

    WITH country_level_info AS (
        SELECT
          country_name,
          MAX(group_name) AS group_name, -- MAXIMUM ON GROUP NAME WILL CHOOSE THE NON NULL VALUE WHICH IS WHAT WE WANT
          SUM(percent_value) AS sum_percent
        FROM data 
        GROUP BY 1 
        HAVING MAX(group_name) != '' OR  MAX(group_name) != NULL
        ),
        ranking AS (
        SELECT  
          *,
          ROW_NUMBER() OVER(PARTITION BY group_name ORDER BY sum_percent DESC) AS rank_
        FROM country_level_info
        )
        SELECT country_name, 
               group_name, 
               sum_percent 
        FROM ranking WHERE rank_ = 1
        ORDER BY sum_percent DESC

Другие вопросы по теме