а нахрена так делать, если можно сначала выбрать уникальные, а потом по ним сделать агрегацию?
Как именно выбрать уникальные в нашем случае? Когда нужно еще много чего считать и много по чему группировать? В общем случае, уникальные выбрать можно,конечно, но это добавит еще один уровень вложенности, и суммарно получится хуже и запутаннее.
А что тут непонятного? Вам надо посчитать количкество уникальных записей - вы используете COUNT(DISTINCT table.id), а если Вы захотите посчитать сумму поля в уникальных записях, то сделать SUM(DISTINCT table.value) у Вас не получится. А с этой функцией получится. Разве это не удобно?
А что тут непонятного? Вам надо посчитать количкество уникальных записей - вы используете COUNT(DISTINCT table.id), а если Вы захотите посчитать сумму поля в уникальных записях, то сделать SUM(DISTINCT table.value) у Вас не получится. А с этой функцией получится. Разве это не удобно?
нет, если она выполняется дольше и больше ресурсов, у вас будет миллион записей, вы будете забивать массив до миллиона, вы сами вешаете якорь на запрос. это не та структура и не тот инструмент для этого, агрегатные функции выполняют ПРЕОБРАЗОВАНИЕ данных, а вы должны ПОДГОТОВИТЬ их ДО агрегации, я вам уже в который раз это пишу.
нет, если она выполняется дольше и больше ресурсов, у вас будет миллион записей, вы будете забивать массив до миллиона, вы сами вешаете якорь на запрос. это не та структура и не тот инструмент для этого, агрегатные функции выполняют ПРЕОБРАЗОВАНИЕ данных, а вы должны ПОДГОТОВИТЬ их ДО агрегации, я вам уже в который раз это пишу.
Если ее сделать на С то она выполняется не дольше чем простое суммирование, и значительно быстрее, чем с подзапросом.
а откуда вообще здесь дубли будут common.sum_distinct( CAST((si.price #>> '{value}') AS numeric) * CAST((si.quantity #>> '{value}') AS numeric) * CASE WHEN CAST(si.options #>> '{deliveries}' AS numeric) > 0 THEN CAST(si.options #>> '{deliveries}' AS numeric) ELSE 1 END, si.id) sum, у вас все данные из si, si.id первичный ключ. вы где то делаете join где возникают дубли?
а откуда вообще здесь дубли будут common.sum_distinct( CAST((si.price #>> '{value}') AS numeric) * CAST((si.quantity #>> '{value}') AS numeric) * CASE WHEN CAST(si.options #>> '{deliveries}' AS numeric) > 0 THEN CAST(si.options #>> '{deliveries}' AS numeric) ELSE 1 END, si.id) sum, у вас все данные из si, si.id первичный ключ. вы где то делаете join где возникают дубли?
Дубли будут так как один товар может принадлежать разным категориям, и, соответственно, разным каталогам.
т.е. вы классическую задачу по исключению дублей, решили заменить собственным велосипедом реализованным в парадигме другого языка программирования, а потом у вас почему то тормозит pgplsql? типовые решения вам коллеги выше описали, можете натягивать сову на глобус.
т.е. вы классическую задачу по исключению дублей, решили заменить собственным велосипедом реализованным в парадигме другого языка программирования, а потом у вас почему то тормозит pgplsql? типовые решения вам коллеги выше описали, можете натягивать сову на глобус.
Так объясните, как классически это решить. Вариант с подзапросом не катит - делали - сильно проигрывает по производительности.
Как именно выбрать уникальные в нашем случае? Когда нужно еще много чего считать и много по чему группировать? В общем случае, уникальные выбрать можно,конечно, но это добавит еще один уровень вложенности, и суммарно получится хуже и запутаннее.
> но это добавит еще один уровень вложенности
Да, добавит.
> , и суммарно получится хуже и запутаннее.
А Вы пробовали (вдруг получится на самом деле приемлемо)? И да, для уменьшения запутанности и уровней вложенности можно использовать CTE — так зачастую намного нагляднее получается в нетривиальных случаях.