LINUX.ORG.RU

Как сделать вот такой SQL запрос

 


0

1

База - postgresql.
Есть гипотетическая таблица:

имя	| Какой нибудь ид
Вася	| 1
Петя	| 2
Дима	| 1
Саша	| 3
Дима	| 3
Вася	| 2

Из нее нужно сделать вот такую таблицу:

имя 	| Список ид
Вася	| 1,2
Петя	| 2
Дима	| 1,3
Саша	| 3

Такое можно сделать средствами постгреса?

★★★★★

имхо никак. потому что задача СУБД - хранение и поиск данных, а не их приобразования.

anonymous
()
Ответ на: комментарий от anonymous

Но ведь есть всякие count и sum... В моем примере нужна функция по типу sum только для конкатенации

TDrive ★★★★★
() автор топика
Ответ на: комментарий от anonymous

потому что задача СУБД - хранение и поиск данных, а не их приобразования.

Гг. Тогда bdb хватило бы всем с головой.

baverman ★★★
()
Ответ на: комментарий от TDrive

если ид очень маленькие то что-то потипу sum(pow(2,некий ид))

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous

ты будешь удивлён.. man zodb

И чем же меня должна удивить тормозная недобд?

baverman ★★★
()
Ответ на: комментарий от baverman

string_agg то что нужно, спс. только там еще тип ид нужно приводить к text.

TDrive ★★★★★
() автор топика
Последнее исправление: TDrive (всего исправлений: 1)
Ответ на: комментарий от TDrive

Пиши процедуру, которая на входе берёт список и склеивает его.

Evgueni ★★★★★
()

Не знаю как в постгресе, но в оракле приходилось писать функцию, которая конкатенирует информацию по id и выводит ее в result - вот пример:

   cursor get_diag_pacient is
-- твой запрос для хранения в курсоре
	OPEN get_diag_pacient; 
  
  for i in 1.. get_diag_pacient%rowcount loop

   FETCH get_diag_pacient INTO v_diag;	
          res:= res || ' ' || v_diag;
          
         end loop;
  
  
	CLOSE get_diag_pacient; 
return (trim(res));
end;
nt_crasher ★★★
()
Ответ на: комментарий от nt_crasher

LISTAGG? БД не стоят на месте, ваши древние велосипеды, как правило, становятся не нужными с очередным релизом.

baverman ★★★
()

в контрибах есть агрегатные функции чтобы ты смог группировать по имени и слеплять иды в массив, кажется

anonymous
()
Ответ на: комментарий от TEX

у нас достаточно тривиально

Где у нас?)

как постгре не знаю

Ответ уже давно написали. string_agg().

TDrive ★★★★★
() автор топика
Ответ на: комментарий от RedPossum

он спросил, я ответил,

Очень странно смотрится когда в 4 посте дают ответ а потом еще 10 постов «Не знаю как в постгресе но...»

я только в упор не понимаю зачем это тс'у (то есть тебе)

Для работы естественно.) Только там была задача намного сложнее, просто выделил интересующий меня вопрос в маленькую придуманную задачу.

TDrive ★★★★★
() автор топика
Ответ на: комментарий от TDrive

Для работы естественно.)

ну это понятно. Ну опиши задачу, хотя бы кратко, я а то в голову не идет зачем таким образом на стороне СУБД данные представлять.

RedPossum ★★★★★
()
Ответ на: комментарий от RedPossum

Ну опиши задачу, хотя бы кратко, я а то в голову не идет зачем таким образом на стороне СУБД данные представлять.

Есть таблица с некими событиями ид события, время начала, время окончания, куча всяких данных. Есть вторая таблица в которой идет привязаны адреса домов к ид событию. Нужно было вывести количество событий за определенный пириуд для каждого адреса + посчитать общую длительность этих событий + ид самих событий через запятую. Джойним таблицы, делаем group by по адресу, общее время вычисляем и складываем через sum, количество событий через count, список идентификаторов, как выяснилось, через string_agg.

TDrive ★★★★★
() автор топика
Ответ на: комментарий от baverman

LISTAGG

Она появилась то ли в 10, то ли в 11-й версии. А в старых приходится выкручиваться самописными велосипедами.

orm-i-auga ★★★★★
()
Ответ на: комментарий от RedPossum

вот блин, генератор отчетов чтоле прикрути для такого.

Зачем если это делается одним запросом к базе? К тому же это не совсем отчет, скорее статистика.

TDrive ★★★★★
() автор топика
Ответ на: комментарий от orm-i-auga

А в старых приходится выкручиваться самописными велосипедами.

Пользователи копробаз должны страдать, да.

baverman ★★★
()
Ответ на: комментарий от anonymous

приобразования

приобразование - это то, что ты получил вместо образования

alexku
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.