Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Предыдущий вопрос про comma delimited наоборот / 10 сообщений из 10, страница 1 из 1
17.08.2003, 10:46
    #32238372
Andriy Loginov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предыдущий вопрос про comma delimited наоборот
Есть запрсос(SELECT) результат которого выглядит так
field1|field2
aa |b
aa |c
aa |d
bb |b
bb |c
bb |d
А хочется получать на выходе такое
aa |b,c,d
bb |b,c,d
Не подскажет кто как сделать эелательно стандартными функциями

Спасибо
...
Рейтинг: 0 / 0
18.08.2003, 07:46
    #32238529
Konrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предыдущий вопрос про comma delimited наоборот
Описание таблицы желательно..
...
Рейтинг: 0 / 0
20.08.2003, 18:12
    #32242312
Andriy Loginov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предыдущий вопрос про comma delimited наоборот
Вот сверху же и привел
два поля Что еще нужно?
...
Рейтинг: 0 / 0
22.08.2003, 12:39
    #32244488
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предыдущий вопрос про comma delimited наоборот
create function my_cat(char,char) returns char as '
select
case when $1=\'\' or $1 is null
then
case when $2=\'\' or $2 is null
then
\'\'
else
$2
end
else
case when $2=\'\' or $2 is null
then
$1
else
$1 || \', \' || $2
end
end
' language SQL;

create aggregate my_cat( sfunc = my_cat, basetype = char, stype = char, initcond = '' );

select field1, my_cat( field2 ) from table1 group by field1;
...
Рейтинг: 0 / 0
22.08.2003, 19:28
    #32245246
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предыдущий вопрос про comma delimited наоборот
Интересно. Встречался вопрос о конкатенации строк при группировке. Надо полагать и такая вещь реализуема?
...
Рейтинг: 0 / 0
26.08.2003, 09:53
    #32247055
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предыдущий вопрос про comma delimited наоборот
Код который я привел - это и есть конкатенация строк при группировке, но с разделителем - запятой. Конкатенация без разделителя выглядит намного проще (код не проверял):

create function my_cat(char,char) returns char as 'select $1 || $2' language SQL;

create aggregate my_cat( sfunc = my_cat, basetype = char, stype = char, initcond = '' );

select field1, my_cat( field2 ) from table1 group by field1;
...
Рейтинг: 0 / 0
27.08.2003, 16:46
    #32249126
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предыдущий вопрос про comma delimited наоборот
Спасибо за ответ. Я что-то стал рассеян :). Заметил что (пере)спросил собственно об ответе именно на этот вопрос. Пообчитал букварь на эту тему.

Появилось 2 вопроса (~1,5):

1. Правильно ли я понимаю, что агрегатные функции - всегда функции одного переменного (а именно - поля), т.е. нет способа объявления агрегатной функции с некоторым параметром?

Например: Я обобщаю мои желания что-то конкатенировать следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE FUNCTION my_cat(char,char, char) RETURNS CHAR AS ' 
 SELECT 
  CASE WHEN $1 = \'\' or $1 IS NULL THEN 
    CASE WHEN $2=\'\' OR $2 IS NULL THEN
     \'\' 
    ELSE 
     $2 
   END 
  ELSE 
    CASE WHEN $2=\'\' OR $2 IS NULL THEN 
      $1 
    ELSE 
      $1 || $3 || $2 
    END 
  END 
' LANGUAGE SQL; 

где $3 - собственно разделитель. ('' - для простой конкатенации, ', ' - для конкатенации с запятой и т.п.

теперь, предположим, я хотел бы иметь обобщенную агрегатную функцию, некая (первая) переменная которой была бы переменной, по которой ведется агрегирование, а некая иная (вторая) - параметром способа агрегирования. (в нашем случае - разделитель). НАсколько я сейчас понимаю, для реализации такого вызова я должен объявить "обычную" ф-цию 2-х переменных (подставив явное значение параметра), затем объявить агрегатную функцию. Возможность делать это из кода (реализовать процедуру, которая по значению параметра будет генерировать названные ф-ии из "обобщенной") несколько упрощает ситуацию, но все равно, вызов агрегатной возможен только после ее объявления... Насколько правильно мое видение этой ситуации?

2. Есть ли возможность объявить агрегатную функцию по нескольким полям? (положим, вопрос о применении метода свертки по полю 1 должен приниматься из соотношения значения поля 2 и значения свертки поля 2 до текущей, т.е. воспользоваться независимыми агрегатами для неких комбинаций полей не удается). //?Правда, результат, похоже, зависит от порядка обработки записей, но ничего не мешает написать "порядкозависимую" ф-ю одной переменной? - та же конкатенация// Что делать в таком случае? (мыслится например агрегатная ф-я с объявленным пользователем типом данных, который, в свою очередь, приготавливается из пары (более) полей... Если это так, то так-же, видимо, можно передавать параметр и в первом случае?).


Извиняюсь что полез в "надуманные" проблемы, но столкнувшись с "гуру" хотелось бы посмотреть на приемы работы (именно с postgreSQL).

__
PS в каком порядке агрегатная функция обрабатывает данные? Можно ли настоять на собственном порядке? (скажем - телефоны сцеплять в строку с разделителем в порядке возрастания). Например, упорядочив входной набор данных, передаваемых на агрегирование?
___
ЗЫ

"If the state transition function was created with the isstrict attribute (see CREATE FUNCTION"), it cannot be called with NULL parameters. Transition functions declared in this manner cause aggregate execution to behave differently then normal; specifically, all NULL input parameters are ignored, and the function is not called. The previous state value is retained, and the aggregate function continues to process input values."

=>правильно ли понимать, что достаточно в фукции my_cat(char,char) оставить проверку на '' а проверку на null переложить на предложение WITH ( attribute [, ...] ), т.е. закончив обявление {create function my_cat(char,char)...}предлжением {WITH ristrict}?

Еще раз спасибо.
...
Рейтинг: 0 / 0
28.08.2003, 12:00
    #32249850
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предыдущий вопрос про comma delimited наоборот
Выскажу свои соображения не претендуя на звание гуру.

"нет способа объявления агрегатной функции с некоторым параметром"

Вроде бы так и есть. Можно попробовать сделать это например используя composite type или array type или как предложили Вы или еще как-то, но мне кажется что все это похоже на костыли и, возможно, правильнее было бы, если бы агрегатная функция могла иметь более одного аргумента, и эти аргументы передавались бы в sfunc и finalfunc. Это, видимо, решило бы и задачу создания агрегатной функции по нескольким полям.

"в каком порядке агрегатная функция обрабатывает данные"

Думаю, что в порядке поступления записей, определяемым планом запроса. Можно попытаться "запинать" план, но это не даст 100% гарантии, что план не испортится в процессе дальнейшей работы.

# create table table1 ( field1 varchar (16), field2 varchar(16) );
CREATE TABLE
# create index index1 on table1 ( field1, field2 );
CREATE INDEX
# explain select field1, pr_cat( field2 ) from table1 group by field1;
QUERY PLAN
--------------------------------------------------------------------------------------
Aggregate (cost=0.00..57.00 rows=100 width=40)
-> Group (cost=0.00..54.50 rows=1000 width=40)
-> Index Scan using index1 on table1 (cost=0.00..52.00 rows=1000 width=40)

"проверку на null переложить на предложение WITH ( attribute [, ...] )"

Да, вроде бы можно так сделать: "STRICT" или "WITH isStrict".
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
15.12.2004, 22:01
    #32829355
centur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предыдущий вопрос про comma delimited наоборот
поднима старое - но может кому поможет


собственно в вышеуказанном букваре именно такой пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Examples

The following example defines an aggregate function named sum(), for use with the text data type. This aggregate calls the textcat(text,text) function built into PostgreSQL to return a concatenated "sum" of all the text found in its input values:

booktown=# CREATE AGGREGATE sum ( BASETYPE = text,
booktown(#                        SFUNC = textcat,
booktown(#                        STYPE = text,
booktown(#                        INITCOND = '' );
CREATE
booktown=# SELECT [color=red]sum(title || ' ')[/color] FROM books WHERE title ~ '^L';
              sum
-------------------------------
 Little Women Learning Python
( 1  row)



где вторую переменную варьируют, т.е. хочешь пробел, хочешь запятую . Решаем вышеуказанный вопрос номер 1
...
Рейтинг: 0 / 0
15.12.2004, 22:02
    #32829356
centur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предыдущий вопрос про comma delimited наоборот
пытался выделить цветом а nested tags нету =(( смотреть на вызов функции sum
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Предыдущий вопрос про comma delimited наоборот / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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