Как определить для каждой column1 макс значение column3 и вывести column2

У меня есть таблица:

ethnicity | item | count

Надо для каждой ethnicity найти item с наибольшим количеством count и вывести эти 3 колонки.


Ответы (2 шт):

Автор решения: Alexey R.

Например так:

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;

Тест здесь.

→ Ссылка
Автор решения: Akina
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().

→ Ссылка