创建 MySQL 购物篮分析
Creating a MySQL market basket analysis
对于我的数据 class 的最终项目,我正在尝试从数据库在 MySQL(使用 Workbench 6.3 CE 和 Server 5.7)中创建市场购物篮分析超过 900,000 笔交易。
这是我整理的 table 我需要的草图(有些东西供以后查询)...
Table:
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 没用。
有没有人知道我在这里做错了什么或者我应该做些什么来加快速度?提前致谢。
*编辑:这是您要求的额外上下文。 *
我目前创建的两个自定义 table:
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
根据您的查询,您似乎正在尝试生成 "also purchased" 或 "purchased with" 类型的分析。
下面的查询应该 运行 明显更快。它消除了查询中的子查询并大大简化了任务。
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
对于我的数据 class 的最终项目,我正在尝试从数据库在 MySQL(使用 Workbench 6.3 CE 和 Server 5.7)中创建市场购物篮分析超过 900,000 笔交易。
这是我整理的 table 我需要的草图(有些东西供以后查询)...
Table:
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 没用。
有没有人知道我在这里做错了什么或者我应该做些什么来加快速度?提前致谢。
*编辑:这是您要求的额外上下文。 *
我目前创建的两个自定义 table:
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
根据您的查询,您似乎正在尝试生成 "also purchased" 或 "purchased with" 类型的分析。 下面的查询应该 运行 明显更快。它消除了查询中的子查询并大大简化了任务。
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