2011-05-04 3 views
2

데이터베이스 :찾기 연관 규칙

Transaction ProductID 
1    1000 
2    1000 
2    1001 
3    1000 
3    1002 
4    1000 
4    1001 
5    1003 

및 L1 테이블 (내가 Frequenties 항목을 유지) L1 테이블에 따르면, 어떻게 T-SQL 문을 사용하여이 결과를 찾을 수

PRODUCTID SUPPORT 
    1000  4 
    1001  2 
    1002  1 
    1003  1 

? 그리고 내 거래 테이블에서 지원 가치를 찾으십니까?

+-------------+-----------+-----------------+ 
| PRODUCTID1 | PRODUCTID2|  SUPPORT  | 
+-------------+-----------+-----------------+ 
|  1000 | 1001 |   2  | 
+-------------+-----------+-----------------+ 
|  1000 | 1002 |   1  | 
+-------------+-----------+-----------------+ 
|  1000 | 1003 |   0  | 
+-------------+-----------+-----------------+ 
|  1001 | 1002 |   0  | 
+-------------+-----------+-----------------+ 
|  1001 | 1003 |   0  | 
+-------------+-----------+-----------------+ 
|  1002 | 1003 |   0  |, 
+-------------+-----------+-----------------+ 

테스트 테이블 : 사전에

create table transactions(
    ORDERID INT, 
    PRODUCTID INT 
); 

insert into transactions(ORDERID, PRODUCTID) 
values ('1', '1000') 
     ,('2', '1000') 
     ,('2', '1001') 
     ,('3', '1000') 
     ,('3', '1002') 
     ,('4', '1000') 
     ,('4', '1001'), 
     ('5', '1003'); 

    CREATE TABLE L1 
(PRODUCTID INT, 
SUPPORT INT) 

INSERT INTO L1 (PRODUCTID,SUPPORT) 
    SELECT PRODUCTID,COUNT(*) [SUPPORT] FROM transactions 
        GROUP BY PRODUCTID       
        ORDER BY PRODUCTID 

감사합니다. 어떤 논리에 의해

+0

은 지원 열 생산? – Thomas

+0

예를 들어'(1000,1003)' 행의 Support 값이 1이 아닌 이유는 무엇입니까? – Thomas

+0

달성하려는 목표는 무엇입니까? – Baaju

답변

1
WITH Pairs 
    As (SELECT A.PRODUCTID AS PRODUCTID1, 
       B.PRODUCTID AS PRODUCTID2 
     FROM L1 A 
       JOIN L1 B 
        ON A.PRODUCTID < B.PRODUCTID) 
SELECT PRODUCTID1, 
     PRODUCTID2, 
     COUNT(t2.ORDERID) AS SUPPORT 
FROM Pairs 
     LEFT JOIN transactions t1 
     ON t1.PRODUCTID = PRODUCTID1 
     LEFT JOIN transactions t2 
     ON t2.PRODUCTID = PRODUCTID2 
      AND t1.ORDERID = t2.ORDERID 
GROUP BY PRODUCTID1, 
      PRODUCTID2 
1
Select Product1.ProductId, Product2.ProductId, Count(T.OrderId) As Support 
From L1 As Product1 
    Join L1 As Product2 
     On Product2.ProductId > Product1.ProductId 
    Left Join (
       Select T1.OrderId, T1.ProductId As Product1, T2.ProductId As Product2 
       From Transactions As T1 
        Join Transactions As T2 
         On T2.OrderId = T1.OrderId 
          And T2.ProductId > T1.ProductId 
       ) As T 
     On T.Product1 = Product1.ProductId 
      And T.Product2 = Product2.ProductId 
Group BY Product1.ProductId, Product2.ProductId