powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / агрегатное || по одной колонки?
3 сообщений из 3, страница 1 из 1
агрегатное || по одной колонки?
    #39258437
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посдкажите есть ли способ проще реализовать, функция || должна быть агрегатно вычеслена по одной колонке

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
-- в базе хранятся версии кучи значений, необходимо по одному id соединить все значения j последовательно
with repository_jsonb as (select 1::bigint as version, true as s, '{"id": "21843927", "id_pac": null, "org_id": "139"}'::jsonb as j
union all select 2, true, '{"id": "21843927", "org_id": "140"}'
union all select 3, true, '{"id": "21843927", "org_id": "141"}'
union all select 1, true, '{"id": "21843920", "id_pac": null, "org_id": "139"}'
union all select 4, true, '{"id": "21843927", "id_pac": "123"}'
union all select 5, true, '{"id": "21843927", "org2_id": "100"}'
),
repository_jsonb

r as (
with recursive t as (
	select j->>'id' as id, j, s, version from repository_jsonb where s and version=1
	union 
	select t.j->>'id', t.j||j.j, j.s, j.version from t inner join repository_jsonb j on id = j.j->>'id' and t.version+1=j.version where j.s
	)
select t.* from t inner join (select id, max(version) as version from t group by id) t2 using(id, version)
	)
-- рабочий вариант:
select * from r

--неудавшая попытка так как учитывается состояние только до изменения
--select *, (lead(j,-1,'{}'::jsonb) over(order by j->>'id' , version))||j, (lead(j,-1,'{}'::jsonb) over(order by j->>'id' , version)), j from 



не хватает функции? которая аналогично SUM(pole), сработала для ||(j), где каждое новое значение соединяется с предыдущим результатом, и еще бы в оконках если бы работало вообще супер было.

может уже все это придумано, я просто не смог найти?


правильный результат:
"21843920";"{"id": "21843920", "id_pac": null, "org_id": "139"}";t;1
"21843927";"{"id": "21843927", "id_pac": "123", "org_id": "141", "org2_id": "100"}";t;5
...
Рейтинг: 0 / 0
агрегатное || по одной колонки?
    #39258446
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

Ghmm
https://www.postgresql.org/docs/9.5/static/functions-aggregate.html

json_agg(expression) any json aggregates values as a JSON array
jsonb_object_agg(name, value) (any, any) jsonb aggregates name/value pairs as a JSON object
что то из этого подойдет в теории.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
агрегатное || по одной колонки?
    #39258594
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,
попробовал агрегатные функции, в теории должны были сработать, на практике не смог добиться нужного результата

вот еще придумал один способ как можно сделать без рекурсии (если только она не используется в стандартной функции которую использовал)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with repository_jsonb as (select 1::bigint as version, true as s, '{"id": "21843927", "id_pac": null, "org_id": "139"}'::jsonb as j
	union all select 2, true, '{"id": "21843927", "org_id": "140"}'
	union all select 3, true, '{"id": "21843927", "org_id": "141"}'
	union all select 1, true, '{"id": "21843920", "id_pac": null, "org_id": "139"}'
	union all select 4, true, '{"id": "21843927", "id_pac": "123"}'
	union all select 5, true, '{"id": "21843927", "org2_id": "100"}'
	)
	select id, version, key, value from (
	SELECT (j->>'id')::bigint as id, version, max(version) over(partition by j->>'id', t.key) as max_version , t.key, t.value FROM repository_jsonb, LATERAL jsonb_each_text(J) T 
	)t where version = max_version
	


результат в виде таблицы который даже больше подходит для дальнейшего использования
idversionkeyvalues218439201"id""21843920"218439201"id_pac"""218439201"org_id""139"218439275"id""21843927"218439274"id_pac""123"218439273"org_id""141"218439275"org2_id""100"
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / агрегатное || по одной колонки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]