by ...
Хочется теперь вместо min/max ID вывести, например, колонку name из той же таблицы T, из тех строк, в которых нашлись эти min/max ID.
Понятно что можно приджойнить саму таблицу T сначала по условию max(id) = id, потом ещё раз по min(id) = id, и вытащить name. Но это предполагает много проходов по таблице. А можно за один?
https://www.cybertec-postgresql.com/en/postgresql-grouping-sets-rollup-cube/ Попробуйте это, может быть найдете полезное
(array_agg(target_field order by id asc nulls last))[1], (array_agg(target_field order by id desc nulls last))[1]
Интересная идея :) Только я боюсь оно честно составит массив из всех значений target_field в памяти? Их потенциально много...
Ну, у нас с аналогичным поиском соответствия максимуму/минимуму по таблице на 120 миллионов записей проблем не вызывает
Составит. Зато каждый массив большэ гигабайта не займёт -- ограничение postgres. Не упадёт сервер от недостатка памяти.
Небось у вас, как у нормальных читеров, на это индэксы повешэны, да?
На поле timestamp, по которому сортировка идет, — да А поле, которое в массив собирается — нет, это код статуса
Понятно, что на поле, которое в сортировке и min/max, да.
Хотя оно и не особо обязательно, наверное, в нашем случае: там таблица из разряда "услуга — дата наступления статуса — код статуса". В среднем на услугу 48 статусов, и без фильтрации/джоина по услуге к этой таблице не обращаются
Обсуждают сегодня