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

Добрый день! Подскажите пожалуйста направление решения задачи с определением самых

товаров в корзине.
Есть таблица с продажами
Заказ/товар/количество/стоимость

Необходимо определить какие товары чаще всего продаются с определенным товаром.
Те отбираем все заказы с определенным товаром и теперь надо определить какие наборы товаров встречаются чаще всего с этим товаром, набором является минимум 2 товара в корзине максимум 5
Например: молоко, йогурт и батон встречается в 70% заказах, а молоко, йогурт, батон и банан в 10% заказах
Как это определить с помощью питона понятно, но можно ли вычислить наборы на уровне запроса к бд?

7 ответов

14 просмотров

- группировка по заказу, через groupArray делаете массив товаров - используете этот массив как ключ группировки следующего уровня, считаете count - сколько вариантов этой корзинки встретилось - дальше начинается самое интересное - разделить слишком большие корзинки на малые. тут надо развлекаться с нграммами. Можно и в КХ, только товары надо превратить в буквы :) Данных-то много? Может и правда проще на питоне?

Evgeniy-Sergeev Автор вопроса
Evgeniy Sergeev
Хочется красиво )

Плюс надо сделать не единоразовый анализ, а инструмент аналитика

Evgeniy-Sergeev Автор вопроса
Evgeniy Sergeev
Плюс надо сделать не единоразовый анализ, а инстру...

Поэтому хочется понять можно ли это сделать полностью на уровне запроса

Evgeniy Sergeev
Поэтому хочется понять можно ли это сделать полнос...

сделать можно. Сложное место - перестановки товаров в корзине . Но можно упростить - сделать предопределенные корзинки и проверить что найденная корзинка попадает/похожа на предопределенную.

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, но мне лень

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта