Страницы: 1
RSS
Выборка повторяющихся наборов данных
 
Коллеги, есть идеи по реализации такой задачи?

Дано: список товаров: яблоки, груши, сливы, виноград и т.д. более 1000 значений
Дано: список покупателей: Маша, Петя, Коля и т.д. более 10000 значений
Дано: список продаж:
Маша: яблоки, груши, сливы
Петя: яблоки, виноград
Коля: груши, сливы, яблоки

ЗАДАЧА:
найти список покупателей, выбирающих одинаковый набор покупок. Например: Маша, Коля (яблоки, груши, сливы)
 
Вам, навеное, много приходится платить за прокат гласных букв? Придется, правила для всех (см. пункт об отображаемом имени).
Там же, в правилах, о файле-примере.
 
В имя добавил нужные буквы  :)
Файл-пример приложил
 
Доброе время суток
Вариант SQL-запросом. Файл сохранить в папку c:\1 на умной таблице на листе "Результат" в контекстном меню выбрать обновить. Исходные данные на листе "База".

Успехов.
 
Андрей VG, спасибо!!!
Сейчас буду проверять :)
 
Поправил запрос для устранения фантомных равных накладных. Протестировал на MS SQLLocalDb 2014 для приблизительно 250000 накладных с 4 единицами товара в среднем. Выполнялось около 7 минут. Так что под Excel может быть долго.
 
Не совсем понял, как должен выглядеть результат, но задачка интересная.

Андрей VG, Ваш файл в Excel 2010 приводит к вылету программы. Смог открыть в 2016

Решил на PowerQuery
F1 творит чудеса
 
Коллеги, я решил по другому,
каждому товару присваивается дополнительный код 1,2,4,8,16 и т.д.

Далее сумма по накладной - получаем контрольную сумму набора, например 2+4+8=14
Далее любая сводная по контрольной сумме

Способ хороший, но есть ограничения при 1024 артикулах код достигает предельного максимального числа, которое excel поддерживает
 
рабоче-крестьянский способ - словарь словарей
результат - в окне отладки
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Доброе время суток
Александр, идея со словарём словарей приходила исходно, просто было интересно решить средствами SQL ;)
Выкладываю поправленный вариант. Не в том месте фантомы задавливал. Обнаружилось на более расширенной таблице.

Максим Зеленский, к сожалению, у меня только 2010, что дома, что на работе. И Power View ни там ни там не стоит. Будет ли работать, если поставить для 2010 Power view? Где то попадалась информация, что Power View для 2010 и старших версий не совместим. Было бы интересно как соединяются его средствами значения полей записей.
Результат - в первом столбце выводится минимальный код накладной как признак группы одинаковых по товарам накладных, а в третьем совпадающие с ним по товарам номера накладных. Имена покупателей просто добавлены.

Цитата
DenDen написал:
но есть ограничения при 1024 артикулах код достигает предельного максимального числа,
На самом деле всё ещё хуже. LOG10(2^54) уже 16 значащих цифр - предел для типа Dobule. На самом деле, что бы видно было разницу между 2^54 + 1 и 2^54 + 2 нужно использовать скорее всего 2^50 максимум. То есть закодировать  уникальными суммами, вы сможете не более 50-52 товаров.
Изменено: Андрей VG - 27.10.2015 08:55:56
 
Цитата
Максим Зеленский написал:Смог открыть в 2016 . Решил на PowerQuery
господа, я вот всё её не могу найти PQ в xl2013 Professional (который у меня на ноуте) - и в надстройках не могу найти... это нормально? и что мне делать? (sorry за дилетантский вопрос - всё не знаю, как добраться до PQuery)... вроде в xl2016 он уже встроен по умолчанию (но у меня не 2016), а как для xl2013? заранее спасибо (хочется посмотреть сие творение  :) )
Изменено: JeyCi - 27.10.2015 10:16:06
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, попробуйте его скачать и поставить Microsoft Power Query для Excel. Судя по требованиям к системе, это для Microsoft Office 2013.

P. S. На словаре словарей отработало за 20 секунд те же самые данные, которые MS LocalDB 2014 обрабатывал 7 минут.
Изменено: Андрей VG - 27.10.2015 10:33:11
 
Цитата
Андрей VG написал:
P. S. На словаре словарей отработало за 20 секунд те же самые данные, которые MS LocalDB 2014 обрабатывал 7 минут.
при одинаковых результатах, полагаю? :)
да, обычно более "близкими" средствами - встроенными или с минимальным промежуточным интерфейсом. получается быстрее.
на множество библиотек, драйверов баз данных и т.д. - много накладных расходов.
главное - чтобы "быстрым" способом можно было принципиально обработать реальные данные.
а это не всегда так.
поэтому, безусловно, Ваш пример на SQL, Андрей, более познавателен и интересен.
а словарь словарей в данном случае более практичен.  ;)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Microsoft Power BI

задаюсь таким же вопросом
Цитата
Андрей VG написал:  попадалась информация, что Power View ... Было бы интересно как соединяются его средствами значения полей записей.
т.е. Power View  - это графика, а Power Query - это запросы к бд...
скачала по линку из #12 - установилось по умолчанию в 2013 - (чуть что искать в Файл-Параметры-Надстройки. Выбираем «Надстройки СОМ») - появилась вкладка Power Query... вопрос остался  :oops: ... выбрала:
1) Запустить редактор --> (Редактор запросов)
2) Просмотр --> Расширенный редактор
3) увидела
это запрос?

4) испугалась, закрыла
... вопрос остался - это всё ручками надо написать? и на каком языке?.. или есть варианты попроще (может, кто-нибудь посоветует ресурс о том, как Максим это сделал?)  :oops: ... пока продолжаю пользоваться xl2010, но решение из #7 - даёт надежду на использование xl(2013) для такого рода задач - без vba  
Изменено: JeyCi - 27.10.2015 13:32:00
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Андрей VG, Power Query ставится и на 2010, и на 2013, а в 2016 уже встроено. Так что можно, пробуйте. Вещь интересная, хоть и проигрывает SQL в скорости, но 80-90% всего делается на UI, методом научного пальца. Вообще это революция в области ETL для Excel. А если к этому добавить Ваш опыт в SQL, то вообще бомба ))
JeyCi, не бойтесь, ))) там руками подправлено несколько строчек (использована нестандартная агрегатная функция
И функция сцепления). Остальное - нажатие кнопок. Там справа посмотрите, список шагов. Последовательно жмите, начиная с верхнего, и смотрите на результат.

Язык называется "M" )))

Книг по PQ мало. Я вот буквально на днях купил у Ken Puls только вышедшую "M for (Data) Monkey", там подробно и с самого начала описывается, что это и зачем. Могу поделиться в узком кругу, хотя стоит она всего 14$ у автора. Не грех и купить
На русском языке ресурсов крайне мало, слезы. На английском - есть блог того же Ken Puls, Chris Webb, блог thebiccountant.Com - это самые пока полезные и крутые.
Изменено: Максим Зеленский - 27.10.2015 14:30:39
F1 творит чудеса
 
Цитата
Максим Зеленский написал: Там справа посмотрите, список шагов. Последовательно жмите, начиная с верхнего, и смотрите на результат.
шаги так и называются (как в запросе то, что слева от знака =)...
понажимала, посмотрела - действительно, не страшно - очень похож PQ на конструктор, и Последовательность шагов чем-то похожа на использование макрокоманд в Access при создании макросов... вот такие впечатления: кода мало получается, и его можно собрать (как макрос в Access из макрокоманд) - собрать его можно в PQ кнопками на ленте без VBEditor... (быстро и удобно, не забывать, что алгоритм связей, отбора и др. действий с данными и последовательность этих действий, как всегда тоже важны, чтобы работало оптимально)... вобщем, действительно, с первого взгляда напоминает возможности работать с реляционными таблицами прямо с ленты... вопросов нет  :) (надо разбираться)... (спасибо за пример на этой задаче)
Изменено: JeyCi - 27.10.2015 22:26:55
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Доброе время суток
Максим Зеленский, большое спасибо за наводку. Пока из литературы "бесплатно" нашёл Power Query for Power BI and Excel. Плюс основной справочник от Microsoft Power Query (informally known as "M") Formula reference.
По паразитировал на вашем примере, сделал почти тот же вариант, что и на SQL (правда, связь с покупателями не делал). По времени на большой тестовой таблице такая же скорость, что и с словарём словарей, но вот не задача - число строк не сходится. SQL-же запрос со словарём словарей сошёлся. Посмотрите, пожалуйста, может что у меня не верно в Power Query запросе? Правда, в выложенном примере ошибки в результате нет. А книгу с 1000000 записей не выложишь, увы.
UPDПодредактировал запрос. Убрал лишние действия. Файлы перекладывать не стал
Скрытый текст
Убрав одно, добавил другое ;)

Цитата
JeyCi написал:
обрать его можно в PQ кнопками на ленте без VBEditor... (быстро и удобно,
Увы, чуть посложнее запрос и толку то от "визуального" построителя запросов в Access. В примере базы в архиве вложения хотя бы псевдонимы таблиц показывает, а бывает что вообще в режим конструктора переключаться не хочет :( Так что, думаю, с чем то худо-бедно сложным в Power Query такая же тонкая "ручная" работа.
Изменено: Андрей VG - 28.10.2015 08:27:35
 
Цитата
Андрей VG написал:
Плюс основной справочник от Microsoft Power Query (informally known as "M") Formula reference.
там, кстати, можно скачать два очень полезных файла, по ссылкам под фразой "Download PDF reference"

Андрей VG,
посмотрел запрос, немного подправил в двух местах: добавил удаление дублирующихся накладных у одного покупателя, как вы писали
Цитата
Андрей VG написал:
Поправил запрос для устранения фантомных равных накладных.
или я не совсем понял идею и убирать нужно полностью дублирующиеся накладные? Добавил там в комментарии нужный код.
Проверьте на большой базе, может, в дубликатах дело?

Плюс убрал один лишний шаг не заметил сразу, что вы уже убрали

Скрытый текст
Изменено: Максим Зеленский - 28.10.2015 09:35:58
F1 творит чудеса
 
Цитата
Андрей VG написал: Так что, думаю, с чем то худо-бедно сложным в Power Query такая же тонкая "ручная" работа.
Андрей VG, я с вами абсолютно согласна (нюансы могут быть - да и инструмент новый)... (быстро и удобно) имела ввиду "написать" (как для меня)  по сравнению с тем кодом, который получился бы при решении чисто макросом... хотя, конечно, вы и ikki правы - скорость исполнения кода vba немаловажный плюс, но иногда (и даже часто) важно быстро и подручными средствами получить нужную раскладку, а не создавать целый макрос...
p.s. пока даже не заявляю, что он лучше odbc-подключений и sql-запросов для моих целей  ;)  - ещё пока не имею оснований делать громкие заявления... всем спасибо за примеры - конечно, всё всегда зависит от конкретной задачи (чтобы подбирать под неё способ решения)...
Скрытый текст
Изменено: JeyCi - 28.10.2015 10:11:03
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Максим, большое спасибо за разъяснения. В принципе, RemDuplicates = Table.Distinct(mergeProduct, {"Покупатель", "Список"}) для меня лишнее. Я тут подбираюсь к решению своей задачи, делаемой сейчас раз другой в год в полуручном режиме. Таких ошибок как дубль первичного ключа Накладная, Товар - у меня в базе нет. (Хотя у меня в таблице скважина, пласт, класс мощности пласта - чуть сложнее, но подход тот же).
По поводу фантомов. В SQL-запросе идёт внутреннее объединение t1.Накладная<t2.Накладная. Пусть совпадают по товарам накладные 1, 2, 3, 4. Требуемый результат вывода
1  2
1  3
1  4
Но в силу вышеприведённого неравенства получаются и фантомы
2  3
2  4
3  4
которые по сути относятся к 1-ой накладной как элементу группировки. (В запросе Power Query - за это отвечает IndexColumn). Как в SQL вывести во второй столбец и 1, но задавить фантомы, сообразить не могу.
Это к построению запроса в Power Query отношения не имеет. Там другой подход - отбор по равенству списков - группировка по равенству, в отличии от SQL по неравенству. И в этом смысле Power Query не зря Power - создание спискового значения поля записи в процессе создания запроса - очень удобный инструмент. В прочем, там похоже много чего ещё наворочено. По сути получившийся в Power Query запрос - полный аналог словаря словарей.
 
Андрей VG, понял, спасибо за разъяснения.
Я все-таки ориентировался на текущую задачу, и без удаления дубликатов "Покупатель-Набор" мы можем получить список покупателей типа "Маша, Маша, Петя, Вася, Петя"
Но думается, нужно еще и проверять накладную на повторы, вдруг один и тот же товар забит несколько раз.
Можно, наверное, через List.Distinct прямо при группировке (не проверял):
Код
 mergeProduct = Table.Group(delCol,{"Номер накладной","Покупатель"}, {"Список", each List.Sort(List.Distinct ([Товар]))}),
 

Ну или доп.столбец следующим шагом
F1 творит чудеса
 
Максим Зеленский, если книга на Русском языке продайте, пожалуйста Могу поделиться в узком кругу, хотя стоит она всего 14$ у автора часть книги. А именно функции Table.Group, Table.Expand List Column за символическую сумму. Спасибо.
Страницы: 1
Наверх