Как группировать данные, если у них есть уникальные id?
Вы пытаетесь сделать откровенную глупость, выводя значение id в итоговом наборе.

Вот есть некая группа, в ней все off_id одинаковы, но id различны. После группировки все эти записи будут сгруппированы в одну. А теперь, внимание, вопрос: ну и какое одно значение id из всех возможных сервер должен вернуть? не знаете? так ведь и сервер не знает... вот он и генерирует ошибку.

Уберите id из выходного набора. Либо явно и чётко скажите серверу, какое именно значение из всех возможных в группе он должен вернуть. Наименьшее? требуйте MIN(id). Наибольшее? MAX(id). Хоть какое, любое? ANY_VALUE(id).
Это не из-за того, "что у каждой записи есть свой уникальный id", а из-за того, что вы один набор данных (строки в таблице) превращаете в другой (аггрегированные данные), но при этом хотите выбрать ещё и поля из первого набора. Но чтобы это сделать, нужно эти поля тоже конвертировать. Для этого используются аггрегирующие функции: GROUP_CONCAT(), MIN(), AVG() и т.п.