товаров в корзине.
Есть таблица с продажами
Заказ/товар/количество/стоимость
Необходимо определить какие товары чаще всего продаются с определенным товаром.
Те отбираем все заказы с определенным товаром и теперь надо определить какие наборы товаров встречаются чаще всего с этим товаром, набором является минимум 2 товара в корзине максимум 5
Например: молоко, йогурт и батон встречается в 70% заказах, а молоко, йогурт, батон и банан в 10% заказах
Как это определить с помощью питона понятно, но можно ли вычислить наборы на уровне запроса к бд?
- группировка по заказу, через groupArray делаете массив товаров - используете этот массив как ключ группировки следующего уровня, считаете count - сколько вариантов этой корзинки встретилось - дальше начинается самое интересное - разделить слишком большие корзинки на малые. тут надо развлекаться с нграммами. Можно и в КХ, только товары надо превратить в буквы :) Данных-то много? Может и правда проще на питоне?
Хочется красиво )
Плюс надо сделать не единоразовый анализ, а инструмент аналитика
Поэтому хочется понять можно ли это сделать полностью на уровне запроса
сделать можно. Сложное место - перестановки товаров в корзине . Но можно упростить - сделать предопределенные корзинки и проверить что найденная корзинка попадает/похожа на предопределенную.
create table x (order String, sku String) Engine = Memory; insert into x values ('order1', 'banana') ('order1', 'bread') insert into x values ('order2', 'banana') ('order2', 'bread') insert into x values ('order3', 'banana') insert into x values ('order4', 'banana') ('order4', 'milk') insert into x values ('order5', 'break') ('order5', 'milk') select arrayJoin([g, g]), arrayElement(g.1, 1) from (select order, sumMap([sku], [toUInt64(1)]) g from x group by order) group by sku select sku, arrayReverseSort( j -> j.2, arrayFilter( i -> i.1 <> sku, arrayZip(g__.1, g__.2))) x from ( select sku, sumMap(g_) g__ from ( select arrayJoin(g.1) sku, (flatten([g.1, g.1]), flatten([g.2, g.2]),) g_ from ( select order, sumMap([sku], [toUInt64(1)]) g from x group by order) ) group by sku) ┌─sku────┬─x──────────────────────────┐ │ milk │ [('banana',2),('break',2)] │ │ bread │ [('banana',4)] │ │ break │ [('milk',2)] │ │ banana │ [('bread',4),('milk',2)] │ └────────┴────────────────────────────┘ кол-во умножено на 2, это легко починить джойня с 0, а не 1, но мне лень
arrayJoin позволяет сделать декартово п.
Обсуждают сегодня