Создание анализа корзины MySQL - PullRequest
0 голосов
/ 08 мая 2018

В последнем проекте моего класса данных я пытаюсь создать анализ корзины рынка в MySQL (с использованием Workbench 6.3 CE и Server 5.7) из базы данных, содержащей более 900 000 транзакций.

Вот эскиз таблицы, которую я собрал, чтобы получить то, что мне нужно (некоторые вещи предназначены для последующих запросов) ...

Таблица:

sales

Колонки:

pos_trans_id INT(11) 
basketId VARCHAR(45) 
productNumber VARCHAR(25) 
productDescription VARCHAR(255) 
categoryCode VARCHAR(25) 
categoryDescription VARCHAR(255) 
subcategoryCode VARCHAR(25) 
subcategoryDescription VARCHAR(255) 
quantity INT(11) 
purchaseAmt DECIMAL(12,2) 
dateOfSale INT(11)

Это запрос, который я собрал вместе, чтобы попытаться сделать свою собственную версию анализа корзины рынка:

SELECT purchaseone.productNumber, purchaseone.productDescription, purchasetwo.productNumber, purchasetwo.productDescription, purchaseone.basketId
FROM 
    (SELECT DISTINCT productNumber, productDescription, basketId
    FROM sales) AS purchaseone
        JOIN
        (SELECT DISTINCT productNumber, productDescription, basketId
        FROM sales) AS purchasetwo
        ON 
        (
            purchaseone.basketId = purchasetwo.basketId AND
            purchaseone.productNumber != purchasetwo.productNumber AND
            purchaseone.productNumber < purchasetwo.productNumber
            );

Проблема, с которой я сталкиваюсь, заключается в том, что запрос будет выполняться часами, часами и часами и в конечном итоге ничего не даст мне, иначе визуализация в Workbench займет так много времени, что он бесполезен.

У кого-нибудь есть идеи, если я делаю что-то здесь не так или есть что-то, что я должен ускорить? Заранее спасибо.

* Редактировать: вот дополнительный контекст, который вы просили. *

Полный Файл необработанных данных

Две пользовательских таблицы, которые я создал до сих пор:

CREATE TABLE `sales` (\n `pos_trans_id` int(11) NOT NULL DEFAULT \'0\', \n `basketId` varchar(45) DEFAULT NULL, \n `productNumber` varchar(25) DEFAULT NULL, \n `productDescription` varchar(255) DEFAULT NULL, \n `categoryCode` varchar(25) DEFAULT NULL, \n `categoryDescription` varchar(255) DEFAULT \'0\', \n `subcategoryCode` varchar(25) DEFAULT NULL, \n `subcategoryDescription` varchar(255) DEFAULT \'0\', \n `quantity` int(11) DEFAULT NULL, \n `purchaseAmt` decimal(12,2) DEFAULT NULL, \n `dateOfSale` int(11) DEFAULT NULL \n) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE 'date' (\n `dateKey` int(11) NOT NULL, \n `dayOfTheMonth` int(2) DEFAULT NULL, \n `dayOfTheWeek` int(1) DEFAULT NULL, \n PRIMARY KEY (`dateKey`) \n) \n ENGINE=InnoDB DEFAULT CHARSET=latin1

1 Ответ

0 голосов
/ 09 мая 2018

По вашему запросу выясняется, что вы пытаетесь произвести анализ типа «также купленный» или «купленный с». Запрос ниже должен выполняться значительно быстрее. Это устраняет подзапросы в вашем запросе и значительно упрощает задачу.

SELECT 
    a.productNumber, 
    a.productDescription, 
    b.productNumber, 
    b.productDescription, 
    a.basketId
FROM `purchaseone` a
LEFT JOIN `purchaseone` b
ON a.basketId = b.basketId AND
    a.productNumber != b.productNumber AND
    a.productNumber < b.productNumber
GROUP BY a.basketId, a.productNumber, b.productNumber
...