Pull to refresh

Comments 12

желательно указывать в посте, в тегах хотя бы

В данном случае (когда группировка, по сути, иерархическая), вероятно, удобнее будет делать GROUP BY ROLLUP (district, region).

Это без разницы, так как конструкции ROLLUP и CUBE - лишь синтаксический сахар над GROUPING SETS

да, но если синтаксический сахар в данном случае удобен, то почему бы им не пользоваться :)

как конструкции ROLLUP и CUBE - лишь синтаксический сахар над GROUPING SETS

Ммм... а можно не согласиться? Что GROUPING SETS, что ROLLUP - всё это фильтрованный CUBE. А потому что над чем, ещё надо подумать..

Не согласиться можно. Но фильтрованный CUBE подразумевает все же сначала вычисление всех агрегаций, с фильтрацией тех, которые не нужны. Так что вместо синтаксического сахара рискуем потерей в производительности. Все зависит от развитости оптимизатора запросов. Поймет ли он, что не нужно считать агрегаты, которые потом отфильтруются?

В поле группировки есть значения NULL - как отличить частную строку выходного набора (с группировкой по всем полям из выражения группировки) от дополнительной строки (с группировкой только по нескольким их них)? Тест поля на NULL - благополучно провалится...

Действительно, использование null как признака группировки странновато. В Oracle есть спец функция grouping которой передается название столбца и она возвращает 1 или 0 в зависимости от того, свернут этот столбец (в статье null) или нет. Postgres не знаю, но почти наверняка эта функция есть и там.

Для этой цели в PostgreSQL есть функция grouping(), возвращающая битовую маску, указывающую по каким именно столбцам была выполнена свёртка.

Да знаю... просто автору следовало бы описать эту функцию и дать ссылку на документацию (https://www.postgresql.org/docs/current/functions-aggregate.html#FUNCTIONS-GROUPING-TABLE) - а лучше даже с примером. Хотя в статье по рассматриваемой теме столько не упомянуто и пропущено, что и это не спасёт.

Sign up to leave a comment.

Articles