Это проблема использования несгруппированных столбцов в сгруппированном запросе.Как правило, этого следует избегать.Некоторые механизмы БД мешают вам делать это, потому что это не имеет логического смысла - если я хочу product.id для группы, но какой механизм БД выбрать, потому что для одной группы есть несколько вариантов?
ORDER BY предназначен только для работы с агрегатами или сгруппированными столбцами при использовании GROUP BY, но я не уверен, что вы можете легко агрегировать.Вы ищете product.id для строки с MIN (size_position) в группе.Я думаю, что подзапрос для выделения этой строки для каждой группы может быть единственным способом;Я не могу придумать простой способ, чтобы вытащить это из головы.
РЕДАКТИРОВАТЬ
Мой инстинкт в этих случаях всегда заключается в том, чтобы делать это вдва шага.Мне не нравятся гигантские неповоротливые запросы с вложенными подзапросами, просто потому, что я нахожу их нечитаемыми.У вас очень длинный запрос по нормализованной схеме, поэтому я не буду пытаться разбить запрос здесь, скорее всего, сделаю ошибку.
Запрос 1 вызовет product_number, color_number и MIN(size_position) (группировка по product_number, color_number) во временную таблицу.
Запрос 2 затем извлекает product_id для каждого product_number, color_number, size_position в временной таблице.Таким образом, вы можете выполнить соединение непосредственно с позицией минимального размера.
Отрицательная производительность использования временных таблиц во многих случаях преувеличена (не во всех, но, конечно, для 99% запросов, которые я выполнял впоследние 10 лет в торговых приложениях).
Существует еще одна возможность, связанная с самостоятельным присоединением подзапроса, но со схемой, настолько сильно нормализованной, что я думаю, что это не будет особенно выгодно для реализации.