Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2017, 14:35   #1
scumfck
Пользователь
 
Регистрация: 29.05.2017
Сообщений: 13
По умолчанию Поиск популярных пар продуктов в чеке

Друзья, здравствуйте. Подскажите, пожалуйста, как реализовать поиск топа самых популярных пар продуктов, покупаемых в одном чеке, инструмент, но он зависает, если более 40000 строк. Хотелось строк 300000 хотя бы. Структура таблицы примерно следующая:

1 столбец: Дата, 2 столбец: транзакция (собственно номер чека), 3 столбец: номер товара, 4 столбец: название товара, 5 столбец: кол-во

Т.е. надо найти самые популярные пары, у которых совпадает номер чека как раз.

Спасибо.
scumfck вне форума Ответить с цитированием
Старый 18.11.2017, 02:22   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Метод зависит от того, насколько много видов товара (n). Ведь число пар ~n-квадрат. Если n<10000, то можно завести двумерный массив nxn, для каждого чека перебрать все пары и увеличить на 1 соотв. элементы массива.
Если n больше, то массив становится уже слишком большим, и лучше использовать коллекцию/словарь.
Число видов товара можно найти, применив инструмент Данные - Удалить дубликаты к КОПИИ столбца "номер товара".
Приложите файл, хотя бы 1000 строк.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 18.11.2017, 08:54   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Метод зависит от того, насколько много видов товара (n). Ведь число пар ~n-квадрат.
Категорически согласен.
И именно поэтому быстро это всё работать не может.
Особенно с учётом того, что пар в чеке может быть несколько.


Цитата:
Сообщение от Казанский Посмотреть сообщение
Приложите файл, хотя бы 1000 строк.
я, конечно, приношу свои извинения за то, что вмешиваюсь в чужую тему, но, судя по всему, тематика та же, что была в прошлой задаче TC - задача по чекам в вине. Только там в файле нет столбца с номером товара. Но зато представлены данные за 10 дней. Количество записей 51656, уникальных товаров (по названию) - 1048
на выборке из 300000 тысяч количество товаров явно вырастет, но, думаю, что не на порядки (при всё разнообразии, всё-таки ассортимент ограничен). Поэтому, разных товаров <5000. Можно попытаться решить через массив.

p.s. файлик от TC всё равно нужен. Чтобы мои домыслы не привели к тому, что время на анализ и написание кода по некорректным данным. Возможно, что задача у ТС поменялась.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.11.2017, 09:58   #4
scumfck
Пользователь
 
Регистрация: 29.05.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Категорически согласен.
И именно поэтому быстро это всё работать не может.
Особенно с учётом того, что пар в чеке может быть несколько.



я, конечно, приношу свои извинения за то, что вмешиваюсь в чужую тему, но, судя по всему, тематика та же, что была в прошлой задаче TC - задача по чекам в вине. Только там в файле нет столбца с номером товара. Но зато представлены данные за 10 дней. Количество записей 51656, уникальных товаров (по названию) - 1048
на выборке из 300000 тысяч количество товаров явно вырастет, но, думаю, что не на порядки (при всё разнообразии, всё-таки ассортимент ограничен). Поэтому, разных товаров <5000. Можно попытаться решить через массив.

p.s. файлик от TC всё равно нужен. Чтобы мои домыслы не привели к тому, что время на анализ и написание кода по некорректным данным. Возможно, что задача у ТС поменялась.
Прилагаю файл
Вложения
Тип файла: xlsx чеки.xlsx (2.05 Мб, 117 просмотров)
scumfck вне форума Ответить с цитированием
Старый 21.11.2017, 10:19   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от scumfck Посмотреть сообщение
Прилагаю файл
ок.
в этом файле уникальных продуктов ~8000
Вы посмотрели, сколько уникальных продуктов в файле, в котором 300000 записей?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.11.2017, 10:29   #6
scumfck
Пользователь
 
Регистрация: 29.05.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ок.
в этом файле уникальных продуктов ~8000
Вы посмотрели, сколько уникальных продуктов в файле, в котором 300000 записей?
12375 уникальных
scumfck вне форума Ответить с цитированием
Старый 21.11.2017, 12:52   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Импортировал в сиквел [Чеки$]

Создал дополнительную табличку:
Код:
SELECT [Товар Но#] INTO [Товары$] FROM [Чеки$] GROUP BY [Товар Но#] ORDER BY COUNT(*) DESC
выполнил запрос:
Код:
SELECT T.[Товар Но#] AS [Товар1],C2.[Товар Но#] AS [Товар2],COUNT(*) AS [КоличествоПар] 
  FROM ([Товары$] AS T 
          INNER JOIN [Чеки$] AS C1 ON (T.[Товар Но#]=C1.[Товар Но#])) 
          INNER JOIN [Чеки$] AS C2 ON (C1.[Транзакция Но#]=C2.[Транзакция Но#])
  WHERE C2.[Товар Но#]<>T.[Товар Но#] 
  GROUP BY T.[Товар Но#],C2.[Товар Но#]
  ORDER BY COUNT(*) DESC,T.[Товар Но#],C2.[Товар Но#]
Через 12 сек результат, сдублированы правда пары:
Код:
ТОВ237348	ТОВ237349	35
ТОВ237349	ТОВ237348	35
ТОВ231586	ТОВ232715	28
ТОВ232715	ТОВ231586	28
ТОВ099797	ТОВ139528	25
ТОВ139528	ТОВ099797	25
ТОВ099797	ТОВ232715	24
ТОВ232715	ТОВ099797	24
ТОВ211323	ТОВ237348	21
ТОВ237348	ТОВ211323	21
ТОВ053049	ТОВ289218	19
ТОВ193716	ТОВ230700	19
ТОВ230700	ТОВ193716	19
ТОВ232715	ТОВ261046	19
ТОВ261046	ТОВ232715	19 и т.д.
Это все можно и без сиквела, нужна дополнительная страница Товары$ с кодами товаров, на всякий случай упорядочил по количеству вхождений в чеки. На 300000 будет дольше, но не думаю что много часов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.11.2017 в 12:55.
Аватар вне форума Ответить с цитированием
Старый 21.11.2017, 14:49   #8
scumfck
Пользователь
 
Регистрация: 29.05.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Импортировал в сиквел [Чеки$]

Создал дополнительную табличку:
Код:
SELECT [Товар Но#] INTO [Товары$] FROM [Чеки$] GROUP BY [Товар Но#] ORDER BY COUNT(*) DESC
выполнил запрос:
Код:
SELECT T.[Товар Но#] AS [Товар1],C2.[Товар Но#] AS [Товар2],COUNT(*) AS [КоличествоПар] 
  FROM ([Товары$] AS T 
          INNER JOIN [Чеки$] AS C1 ON (T.[Товар Но#]=C1.[Товар Но#])) 
          INNER JOIN [Чеки$] AS C2 ON (C1.[Транзакция Но#]=C2.[Транзакция Но#])
  WHERE C2.[Товар Но#]<>T.[Товар Но#] 
  GROUP BY T.[Товар Но#],C2.[Товар Но#]
  ORDER BY COUNT(*) DESC,T.[Товар Но#],C2.[Товар Но#]
Через 12 сек результат, сдублированы правда пары:
Код:
ТОВ237348	ТОВ237349	35
ТОВ237349	ТОВ237348	35
ТОВ231586	ТОВ232715	28
ТОВ232715	ТОВ231586	28
ТОВ099797	ТОВ139528	25
ТОВ139528	ТОВ099797	25
ТОВ099797	ТОВ232715	24
ТОВ232715	ТОВ099797	24
ТОВ211323	ТОВ237348	21
ТОВ237348	ТОВ211323	21
ТОВ053049	ТОВ289218	19
ТОВ193716	ТОВ230700	19
ТОВ230700	ТОВ193716	19
ТОВ232715	ТОВ261046	19
ТОВ261046	ТОВ232715	19 и т.д.
Это все можно и без сиквела, нужна дополнительная страница Товары$ с кодами товаров, на всякий случай упорядочил по количеству вхождений в чеки. На 300000 будет дольше, но не думаю что много часов
Спасибо большое! Все считает!
scumfck вне форума Ответить с цитированием
Старый 22.11.2017, 09:21   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Можно и без дополнительной таблицы:
Код:
SELECT C1.[Товар Но#] AS [Товар1],C2.[Товар Но#] AS [Товар2],COUNT(*) AS [КоличествоПар] 
  FROM [Чеки$] AS C1,[Чеки$] AS C2
  WHERE C1.[Транзакция Но#]=C2.[Транзакция Но#] AND C2.[Товар Но#]<>C1.[Товар Но#] 
  GROUP BY C1.[Товар Но#],C2.[Товар Но#]
  ORDER BY COUNT(*) DESC,C1.[Товар Но#],C2.[Товар Но#]
и если на сиквеле, то можно и индексы добавить:
Код:
 CREATE INDEX [TempIndex001] ON [Чеки$]([Транзакция Но#])
 CREATE INDEX [TempIndex002] ON [Чеки$]([Товар Но#])
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.11.2017, 09:44   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Можно и без дополнительной таблицы:
круто!
И достаточно легко масштабируется, если надо, например, 3 или 4 самых популярных товара в одном чеке найти.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как избавиться от пустых строк в товарном чеке deninok Microsoft Office Excel 1 23.06.2017 06:48
C++ Поиск совпадающих пар чисел iLeshii Помощь студентам 3 06.12.2013 15:57
Поиск путей между 2 точками 10 пар на поле 36 клетках Aerowalk Фриланс 1 09.05.2011 06:08