У меня есть таблица country_percent, например:
Имя страны | Название группы | процент_значение |
---|---|---|
НАС | EMEA | 10.00 |
НАС | 25.00 | |
ГБ | EMEA | 15.00 |
АП | Одомашненный | 20.00 |
АК | Одомашненный | 12.00 |
ЕС | 5.00 |
Теперь я хотел бы выбрать наибольшую сумму процентного_значения для каждой группы по стране, например:
country_name | group_name | sum_percent |
---|---|---|
НАС | EMEA | 35.00 |
AP | Domestic | 20.00 |
поэтому здесь выбраны США, потому что сумма их процентов была самой высокой для группы EMEA. Обратите внимание, что NULL group_name засчитывается в пользу EMEA из-за совпадения country_name. Также обратите внимание, что ES не появился, так как у него не было никакого group_name против него, и нет другой группы со значением ES.
Можно ли запросить вышеуказанное с помощью Postgres?
Из вашего результата вы пропускаете Испанию, потому что у нее нет группы.
Итак, вы можете сделать это так
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
решение ниже работает для вас?