【问题标题】:SQL - Finding transaction that contain 2 or more item using querySQL - 使用查询查找包含 2 个或更多项目的事务
【发布时间】:2011-05-20 05:32:02
【问题描述】:

我有这张桌子:

TABLE Transaction
Trans_ID    Name    Value    Total_Item  
100          I1     0.33333333        3  
100          I2     0.33333333        3  
100          I5     0.33333333        3  
200          I2     0.5               2  
200          I5     0.5               2  
300          I2     0.5               2  
300          I3     0.5               2  
400          I1     0.33333333        3  
400          I2     0.33333333        3  
400          I4     0.33333333        3  
500          I1     0.5               2  
500          I3     0.5               2  
600          I2     0.5               2  
600          I3     0.5               2  
700          I1     0.5               2  
700          I3     0.5               2  
800          I1     0.25              4  
800          I2     0.25              4  
800          I3     0.25              4  
800          I5     0.25              4  
900          I1     0.33333333        3  
900          I2     0.33333333        3  
900          I3     0.33333333        3  
1000         I1     0.2               5  
1000         I2     0.2               5  
1000         I4     0.2               5 

我需要找到包含某个项目的交易。 EX:2项组合

I1 和 I2 并只保留相关的项目值;

Trans_ID    Name    Value    Total_Item  
100          I1     0.33333333        3  
100          I2     0.33333333        3  
400          I1     0.33333333        3  
400          I2     0.33333333        3  
800          I1     0.25              4  
800          I2     0.25              4    
900          I1     0.33333333        3  
900          I2     0.33333333        3    
1000         I1     0.2               5  
1000         I2     0.2               5  

请注意,我只显示包含这两个项目的交易。

或者可能是 3 项组合 I1、I2 和 I3

800          I1     0.25              4  
800          I2     0.25              4  
800          I3     0.25              4   
900          I1     0.33333333        3  
900          I2     0.33333333        3  
900          I3     0.33333333        3  

我如何在 sql 中编写代码? 我正在使用 msaccess)

【问题讨论】:

  • 这看起来不正常。对于给定的 transactionid,Value 和 Total_Item 的值是否始终相同?
  • 这只是大图的一部分,整个过程应该是这样的Apriori。价值从 1/1 个交易 ID 中的总交易数计算。 total item 就是 1 个交易中有多少个 item ID。

标签: sql ms-access mysql


【解决方案1】:

对于两项组合,搜索匹配行并确保在having 子句中满足所有条件:

select  Trans_ID
from    `Transaction`
where   Name in ('I1','I2')
group by
        Trans_ID
having  COUNT(distinct Name) = 2

对于三项组合,检查三个而不是两个匹配项:

select  Trans_ID
from    `Transaction`
where   Name in ('I1','I2','I3')
group by
        Trans_ID
having  COUNT(distinct Name) = 3

如果您对所有列感兴趣,请将该查询放在子查询中:

select  *
from    `Transaction`
where   Trans_ID in
        (
        select  Trans_ID
        from    `Transaction`
        where   Name in ('I1','I2','I3')
        group by
                Trans_ID
        having  COUNT(distinct Name) = 3
        )

【讨论】:

  • 介意帮我一下吗? sql 语法不允许 count(distinct) 我可以使用子查询的另一个子查询吗?或者你对你给我的查询有什么改变,我可以在访问中实现。先谢谢你
【解决方案2】:

这些将在 Access 中工作:

SELECT * FROM Transaction t 
WHERE t.Trans_ID IN 
    (SELECT t1.Trans_ID
     FROM (SELECT *
           FROM Transaction 
           WHERE [Name]="I1")  AS t1 
     INNER JOIN 
          (SELECT *
           FROM Transaction 
           WHERE [Name]="I2")  AS t2 
     ON t1.Trans_ID = t2.Trans_ID)

AND t.Name IN ("I1","I2")


SELECT * FROM Transaction t 
WHERE t.Trans_ID IN 
    (SELECT t1.Trans_ID
     FROM ((SELECT *
           FROM Transaction 
           WHERE [Name]="I1")  AS t1 
     INNER JOIN 
          (SELECT *
           FROM Transaction 
           WHERE [Name]="I2")  AS t2 
     ON t1.Trans_ID = t2.Trans_ID)
     INNER JOIN 
          (SELECT *
           FROM Transaction 
           WHERE [Name]="I3")  AS t3 
     ON t1.Trans_ID = t3.Trans_ID )

AND t.Name IN ("I1","I2","I3")

【讨论】:

  • 谢谢 :) 它工作得很好 :D 现在我只需要弄清楚如何让它在 vb 中递归再次感谢
猜你喜欢
  • 2020-08-11
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多