创建MySQL市场购物篮分析

时间:2018-05-08 20:42:36

标签: mysql mysql-workbench market-basket-analysis

对于我的数据类的最终项目,我试图在一个包含900,000多个事务的数据库中在MySQL中创建一个市场购物篮分析(使用Workbench 6.3 CE和Server 5.7)。

这是我为了得到我需要的东西(一些用于以后的查询)的表格草图...

表:

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中可视化它将花费很长时间它是无用的。

有没有人知道我在这里做错了什么,或者我应该采取什么措施来加快速度?提前谢谢。

*编辑:这是您要求的额外背景。 *

完整raw data file

到目前为止我创建了两个自定义表:

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 :(得分:1)

从您的查询中,您似乎正在尝试制作一个&#34;也购买了&#34;或&#34;与&#34;一起购买分析类型。 下面的查询应该运行得更快。它消除了查询中的子查询,并简化了任务。

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