агрегация в окне [string_agg() over()]?
Явная сортировка не поддерживается, но можно ли опираться на то, что неявная будет оставаться постоянной без изменения запроса?
Покажи запрос...
Хотя... Можно проще. Order by есть у тебя в запросе?
Если ты имеешь в виду в каком порядке производится агрегация оконной функцией, то этот порядок не имеет значения
В произвольном, конечно. > Явная сортировка не поддерживается И почему это "не поддерживается"? Вы её в OVER() указывайте. > можно ли опираться на то, что неявная будет оставаться постоянной И нет, нельзя.
Запрос трехстраничный, переделать этото место на group by не вариант, сильно усложняет. По сути запрос выдает записи с самым высоким рангом и все варианты склеивает в строку. Это место в одной из вьюх with. Запрос по двум похожим окнам - одно окно с сортировкой для first, второе окно доя string_agg, без сортировки, чтобы бралось все окно. В том же запросе делается distinct по всем полям. В запосе ниже, использующем эту вьюху with, есть сортировка.
Спасибо. Если сортировку для string_agg указать в over, по умолчанию будет нарастающая склейка, а мне нужны все записи окна в каждой строке. Правде не пробовал с разными настройками границ окна поиграться, может получится.
> второе окно доя string_agg, без сортировки, чтобы бралось все окно. Ну так сделайте с сортировкой, но берите всё окно, да и всё.
Бцлет арастающая склейка, писал выше. Спасибо
А что делает string_agg() ?
Вам неплохо бы улучшить своё понимание того, как работают window functions (не обижайтесь). ;) > Бцлет арастающая склейка, писал выше. Спасибо Не будет: WITH t(n, x) AS ( VALUES (1, '2'), (4, '1'), (2, '8') ) SELECT n, x, string_agg(x, ',') OVER (ORDER BY n DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t;
Собирает все варианты, хочется, чтобы они были в порядке ранга. Они так и есть, но не знаю насколько это поведение детерминировано.
Куда собирает варианты чего?
Из https://www.postgresql.org/docs/current/functions-aggregate.html : string_agg ( value text, delimiter text ) → text Concatenates the non-null input values into a string. Each value after the first is preceded by the corresponding delimiter (if it's not null).
Я в string_agg собиоаю в т.ч. и 'n'. Видимо поэтому нарастающая кюсклейка.
Так это уже ахтунг суровый, если все так как Ярослав говорит
Я тут писал суть запроса https://t.me/dba_ru/131062
Нет, не поэтому. И я Вам уже написал, как это решать, нет?
Вот это вот "все варианты склеивает в строку" - это ахтунг, так нельзя делать
Ты потом это обрабатывать не сможешь
Прямо сейчас не могу проверить, поэтому предполагаю, возможно неверно. У меня точно ьыоюламнарастаюшая если брать то же окно, что и для first_value(). Но спасибо в любом случае.
Так точно. Это далее обрабатывается не системно, а руками, проверкой вариантов с низким рангом. Причем на выходе денормализацию со всеми вариантами не хотят, хотят Excel. Такая странная задача, поэтому и запрос такой. Всего записей меньше 300 тыс, для ручной сверки остается не больше 5%.
Естественно, потому что framing option по умолчанию — RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, а без ORDER BY это значит, что в frame входят все записи окна, потому что все они — peers текущей записи (а режим RANGE значит, что frame начинается с первого peer текущей записи, а заканчивается последним её peer). И это основы [понимания] оконных функций, мне кажется. ;)
Да хорошо, уел, пусть я бестолковая белка ;)
При чём тут это? ;) Просто стоит освоить, если уж пользуетесь, IMNSHO. Кстати про "не могу проверить": https://dbfiddle.uk/?rdbms=postgres_13&fiddle=5dc2c21e3ae7117e69ad316cc98c3844
Не всё запоминается с первого раза, тем более по редким задачвм. Вот теперь, благодаря вам запомнил на всю жизнь)) Сам мой вопрос был некорректен, потому что начал думать не в ту сторону и вы правы, что практического понимания пользы range у меня мало, но не правы, что документация его добавляет. Всё работает как хотелось, спасибо))
Обсуждают сегодня