Как исключить одноранговые строки текущей строки из рамки окна? - PullRequest
0 голосов
/ 27 апреля 2018

Схема

create table items(id integer, number integer);
insert into items values
  (1, 1),
  (2, 1),
  (3, 2),
  (4, 2),
  (5, 3);

Запрос

select id, string_agg(id::text, ',') over (order by number)
from items;

Приведенный выше запрос выдает следующее:

id | string_agg
---+-----------
1  | 1,2
2  | 1,2
3  | 1,2,3,4
4  | 1,2,3,4
5  | 1,2,3,4,5

однако я не хочу, чтобы оконная рама включала в себя какие-либо одноранговые строки текущей строки, т. Е .:

id | string_agg
---+-----------
1  | 
2  | 
3  | 1,2
4  | 1,2
5  | 1,2,3,4

Мне нужно что-то вроде:

range between unbounded preceding and (first peer row - 1)

Это вообще возможно?

1 Ответ

0 голосов
/ 27 апреля 2018

Я могу придумать разные способы подойти к этому:

  • Используйте массивы и выполняйте некоторые манипуляции с массивами.
  • Рассчитать значения и затем отдельно объединить окончательный результат в.
  • Странные манипуляции с данными.

Это касается третьего варианта. Он генерирует список, а затем удаляет значения для текущей «группы»:

select id,
       trim(replace(string_agg(id::text, ',') over (order by number),
                    string_agg(id::text, ',') over (partition by number),
                    ''
                   ), ','
           )
from items i;

Это делает следующие два предположения:

  • Идентификаторы уникальны.
  • Единственные повторяющиеся числа - это числа рядом друг с другом.

Здесь - тестер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...