我遇到了与数据无关的问题,我无法弄清楚。我认为提供一些示例数据和预期输出是最简单的,以澄清我的问题。
我尝试使用购买历史来计算Jaccard coefficient。为此,我需要找到一起购买的产品以及购买的次数。
我已获得以下数据:
category_id和item_id一起使产品具有唯一可识别性。我将下面的查询附加到带有一些示例数据的SQL-export。使用以下数据:
期望的结果是:
i1.cat_id : i1.item_id : i2.cat_id : i2:item_id : count
1 : 1 : 2 : 2 : 2
1 : 1 : 1 : 3 : 1
1 : 1 : 1 : 5 : 1
2 : 2 : 1 : 3 : 2
2 : 2 : 2 : 4 : 1
2 : 2 : 3 : 6 : 1
项目被逆转的重现不是问题,甚至可能是需要。
示例数据
CREATE TABLE `test_020516_01` (
`cat_id` int(11) NOT NULL,
`item_id` int(11) NOT NULL,
`visit_id` varchar(2) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `test_020516_01` (`cat_id`, `item_id`, `visit_id`) VALUES
(1, 1, 'A'),
(2, 2, 'A'),
(1, 3, 'A'),
(2, 2, 'B'),
(1, 3, 'B'),
(2, 4, 'B'),
(3, 6, 'B'),
(1, 1, 'C'),
(2, 2, 'C'),
(1, 5, 'C');
以下是我最好的尝试,但它没有得到回报。对于某些组合,计数总计为4,在这种情况下,计数永远不会超过3。
SELECT STAT.cat_id, STAT.item_id, STAT1.cat_id, STAT1.item_id, COUNT(*)
FROM test_020516_01 STAT
JOIN (
SELECT
cat_id, item_id, visit_id AS visit, count(*) AS count
FROM
test_020516_01
WHERE
cat_id != 0
AND
visit_id IS NOT NULL
GROUP BY
cat_id, item_id, visit_id
ORDER BY
count DESC
) STAT1
ON STAT.cat_id != STAT1.cat_id
AND STAT.item_id != STAT1.item_id
AND visit_id != STAT1.visit
GROUP BY
STAT.cat_id, STAT.item_id, STAT1.cat_id, STAT1.item_id;
提前感谢您的任何帮助:)
答案 0 :(得分:1)
我无法理解为什么你要将结果总结为STAT1,或者你正在追求的是什么,但是以下查询可能会指出你正确的方向(因为它的结果与你的预期结果相符,尽管它包括你遗漏的一些组合,我不能说是为了简洁还是因为我不明白的一些要求):
=MID(K22,1,SEARCH(".",K22)-1)&IF(MID(K22,SEARCH(".",K22)+1,1) >4,"."&MID(K22,SEARCH(".",K22)+1,1)+1&"%","."&MID(K22,SEARCH(".",K22)+1,1)&"%")