SQL Fiddle
Вы можете использовать оконную функцию (https://www.postgresql.org/docs/current/static/tutorial-window.html), чтобы получить максимальный элемент для необъявленного массива. После этого вы можете повторно объединить элементы и удалить вычисленныемаксимальное значение из массива.
Результат:
a max_elem remaining
123,534,243,345 534 123,243,345
3,23,1 23 3,17
42 42
56,123,234,345,345 345 56,123,234
Для этого запроса требуется только одно разбиение / удаление, а также только одно максимальное вычисление.
SELECT
a,
max_elem,
array_remove(array_agg(elements), max_elem) as remaining -- C
FROM (
SELECT
*,
MAX(elements) OVER (PARTITION BY a) as max_elem -- B
FROM (
SELECT
a,
unnest((string_to_array(a, ','))::int[]) as elements -- A
FROM arrays
)s
)s
GROUP BY a, max_elem
A:string_to_array
преобразует список строк в массив. Поскольку массивы обрабатываются как строковые массивы, необходимо преобразовать их в целочисленные массивы, добавив ::int[]
. unnest()
расширяет все элементы массива в собственные строки.
B: оконная функция MAX
дает максимальное значение отдельных массивов как max_elem
C: array_agg
повторно объединяет элементы через GROUP BY id
. После этого array_remove
удаляет max_elem
значение из массива.
Если вам не нравится хранить их как чистые массивы, но как список строк снова, вы можете добавить array_to_string
. Но я бы не рекомендовал это, потому что ваши данные являются целочисленными массивами, а не строкамиЗа каждый последующийДля расчета вам понадобится эта строка приведения.Еще лучший способ (как уже было сказано в @stickybit) - хранить элементы не в виде массивов, а в виде необъявленных данных.Как вы можете видеть, почти каждая операция должна выполнять unnest
раньше.
Примечание:
Было бы лучше использовать идентификатор для адресации столбцов /массивы вместо исходной строки, как в SQL Fiddle с идентификаторами