2011-04-25 87 views
0

的我有一個Order表是這樣的:Apriori算法 - 查找2組合

ORDER_ID PRODUCT_ID 
    1  1230 
    1  1231 
    1  1232 
    2  1231 
    2  2000 
    3  1230 
    3  3567 

Product表:

PRODUCT_ID NAME 
    1230  A 
    1231  B 
    1232  C 

我的第一個問題,如何讓2產品表的組合,那麼我的新表結構應該如何?例如

;

{1230,1231}, {1230,1232}, {1231,1232} 

但我不想這{1231,1230}因爲它已經添加。

第二個,在Order表中,我保持銷售產品一個會話。我的新桌子將如何?

示例;

orderid  products 
1   {1230,1231,1232} 

最後,我想找到其他產品一起銷售支持價值,提前 exp: {1231,1230} count : 2 {1230,1232 count : 0 }

感謝。

編輯:我想要做的是這樣的:http://webdocs.cs.ualberta.ca/~zaiane/courses/cmput499/slides/Lect10/sld054.htm

+0

什麼是「雙組合」?例如。爲什麼包含「{1230,1232}」?你真的想要達到什麼?這一點不是很清楚...... – 2011-04-25 18:58:04

+0

你只是試圖找到所有已銷售在一起的產品的組合,以及這種情況的發生頻率如何? – 2011-04-25 19:03:05

+0

我想這樣做:http://webdocs.cs.ualberta.ca/~zaiane/courses/cmput499/slides/Lect10/sld054.htm – user722591 2011-04-25 19:17:22

回答

2

如果我正確解釋了您的要求?

;WITH T(P1, P2, ORDER_ID) 
    AS (SELECT p1.PRODUCT_ID, 
       p2.PRODUCT_ID, 
       O.ORDER_ID 
     FROM Product p1 
       JOIN Product p2 
        ON p1.PRODUCT_ID < p2.PRODUCT_ID 
       JOIN [ORDER] o 
        ON o.PRODUCT_ID IN (p1.PRODUCT_ID, p2.PRODUCT_ID) 
     GROUP BY p1.PRODUCT_ID, 
        p2.PRODUCT_ID, 
        O.ORDER_ID 
     HAVING COUNT(*) = 2) 
SELECT P1, 
     P2, 
     COUNT(*) AS Cnt 
FROM T 
GROUP BY P1, 
      P2 
+0

我不明白你爲什麼把COUNT(*)= 2 – user722591 2011-04-25 19:21:41

+0

因爲我們正在尋找有兩種產品的訂單。我假定每個「PRODUCT_ID」每個訂單隻能出現一次。如果不是這種情況,您可以使用COUNT(DISTINCT PRODUCT_ID)= 2'來代替。不知道這個答案與你發佈的鏈接有多接近! – 2011-04-25 19:23:18

0

我真的不明白的問題2或3,所以請在你的問題澄清。

第一個是棘手,但我認爲你正在尋找的東西是這樣的:

SELECT * FROM products p1, products p2 GROUP BY ((p1.PRODUCT_ID*p2.PRODUCT_ID)+p1.PRODUCT_ID+p2.PRODUCT_ID) 

,因爲它會按行只有在這兩個數是一樣的,而不關心順序組。可能有更優雅的方式來創建什麼基本上是該組合的唯一ID,但我想不出任何。