Вот один из способов сделать это с помощью оконных функций:
WITH cte AS (
SELECT name, cnt, COUNT(*) AS count,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY COUNT(*) DESC, cnt) rn
FROM yourTable
GROUP BY name, cnt
)
SELECT name, cnt, count
FROM cte
WHERE rn = 1;
Демо
Редактировать:
Вот моя попытка решения до MySQL 8+:
SELECT t1.name, MIN(t1.cnt), MAX(t1.count)
FROM
(
SELECT name, cnt, COUNT(*) AS count
FROM yourTable
GROUP BY name, cnt
) t1
INNER JOIN
(
SELECT name, MAX(count) AS max_count
FROM
(
SELECT name, cnt, COUNT(*) AS count
FROM yourTable
GROUP BY name, cnt
) t
GROUP BY name
) t2
ON t1.name = t2.name AND t1.count = t2.max_count
GROUP BY
t1.name;
Демо
Сложность заключается в том, что сначала нам нужно агрегировать как по name
, так и cnt
, чтобы найти максимальные значения для каждой группы.Затем необходимо выполнить запрос, чтобы найти группу для каждого name
, имеющего наибольшее количество.Наконец, требуется другая агрегация, чтобы найти группу name
с наименьшим значением 1033 * cnt
, в случае, если у данного name
есть две подгруппы с одинаковым количеством (например, * 1036).*).