172 похожих чатов

Вот задача, которую очень хочется решить одним запросом в один

проход.
Есть следующие таблицы (id - везде первичный ключ)

client - (id, name) - клиент
product - (id, product_namename)
catalog - (id, catalog_name)
catalog_product_mapping (id, product_id, catalog_id) - маппинг продуктов на каталоги. Продукт может принадлежать нескольким каталогам.
sale - (id, client_id, date). - продажа, У каждой продажи один клиент
sale_item - (id, sale_id, product_id, quantity, price) - элемент продажи

Нужно посчитать одним запросом:
общую сумму продаж,
сумму продаж за каждый день
сумму продаж каждого продукта
сумму продаж каждому клиенту
сумму продаж товаров из каждого каталога (не равна сумме всех прожаж так как товар может быть не в одном каталоге.)

Такая задача, насколько я понимаю, не решается без подзапросов никаким вариантом SUM с группировкой или окнами и решалась бы, если бы была функция SUM(DISTINCT sale_item.id value ), то есть функция, которая суммирует только значения sale_item один раз из каждой уникальной строки.
Вот если мы захотим получить количество записей sale_item, то мы можем это сделать с помощью COUNT(DISTINCT sale_item.id).
Можно подумать в сторону вычисления количества задвоенных записей с помощью того же COUNT() и делить суму на это количество, но какое-то совсем уж избыточное нагромождение получается.
Если все так и есть, как я думаю, то придется написать свою арегатную функцию SUM_DISTINCT со свойствами как описано выше.
Или общество знает как это сделать существующими средствами?

3 ответов

4 просмотра

у вас классика граф, ltree и вперед. я только в прошлом году подобную задачу решал, не знаю насколько это будет работать на 1ккк записях но на 1кк работает шустро.

в вашем понимании одним запросом это должен быть один select или результат должен быть получен одним набором данных?

https://www.postgresqltutorial.com/postgresql-grouping-sets/

Похожие вопросы

Обсуждают сегодня

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Открыл свой двухкилобайтный экзешник в x32dbg, а тут какая-то хрень. Смущает кнопка "выполнить до пользовательского кода", а что ещё может быть в файле помимо него ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
11
Мне были интересны дишные хаки и я нашёл любопытный способ на форуме через __traits, что-то вроде int delegate(int) fac = (int n) => n == 0 ? 1 : n * __traits(parent, {})(n - ...
Constantin F.
1
Всем привет, подскажите/посоветуйте пожалуйста. Фаердак компоненты, имею одно место где бизнес хочет видеть при открытии формы список всех клиентов, это порядка 30к. Мои дово...
Sasha Sch
14
Вопрос тем кто смотрит видео и слушает подкасты - как вы потом ищете нужную вам информацию? Вот статью я прочитал, потом могу искать нужную мне часть банальным поиском. Пропус...
Aleksandr Druzhinin
4
Ребят, если кто в курсе - скажите, а в загранке такое же засилье маркетплейсов? или там простые сермяжные интернет-магазины живут попроще?
Андрей [aharito] Харитонов
14
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
31
Карта сайта