Как определить для каждой column1 макс значение column3 и вывести column2
У меня есть таблица:
ethnicity | item | count
Надо для каждой ethnicity найти item с наибольшим количеством count и вывести эти 3 колонки.
Ответы (2 шт):
Например так:
with grouped as
(
select t1.ethnicity, max(count) count
from Table1 t1
group by t1.ethnicity
)
select grouped.ethnicity, t.item, grouped.count from grouped
inner join Table1 t
on t.ethnicity = grouped.ethnicity and t.count = grouped.count;
Тест здесь.
WITH
cte AS (SELECT ethnicity, item, "count",
-- для каждого ethnicity нумеруем записи по убыванию count
ROW_NUMBER() OVER (PARTITION BY ethnicity ORDER BY "count" DESC) rn
FROM source_table)
SELECT ethnicity, item, "count"
FROM cte
-- для каждого ethnicity берём только запись номер 1 (с максимальным count)
WHERE rn = 1
Желательно наличие индекса по (ethnicity, "count").
Если несколько записей имеют одинаковый и в то же время максимальный "count", запрос выведет одну случайную запись из них.
Если требуется вывести одну определённую (например, с минимальным item) - расширьте соответствующим образом сортировку в определении окна (например, (PARTITION BY ethnicity ORDER BY "count" DESC, item ASC)). Желательно, чтобы такая сортировка была уникальной для группы.
Если же в таком случае требуется вывести все такие записи, а не одну из них, замените ROW_NUMBER() на RANK() либо DENSE_RANK().