【问题标题】:SQL - Find all possible combinationSQL - 查找所有可能的组合
【发布时间】:2011-05-20 03:09:09
【问题描述】:

我需要帮助找到数据库中所有可能的值组合,例如我有这个表:

ITEM_SET           Support  
I1               0.244999999
I2               0.274999999     
I3               0.258333333    
I4               0.103333333  

我需要像这样找到所有可能的组合:

I1,I2    I1,I2,I3    I1,I2,I3,I4
I1,I3    I1,I2,I4
I1,I4    I1,I3,I4
I2,I3    I2,I3,I4
I2,I4 
I3,I4

*请注意,这种格式只是为了帮助阅读,因为我需要的只是一个可能的组合列表,如下表:

ITEMSET
I1               
I2                    
I3                 
I4  
I1,I2    
I1,I3    
I1,I4    
I2,I3    
I2,I4 
I3,I4
I1,I2,I3 
I1,I2,I4 
I1,I3,I4 
I2,I3,I4   
I1,I2,I3,I4

【问题讨论】:

  • 哪种风格的 SQL/RDBMS?例如。 MySql、Sql Server、Oracle 等?
  • 第二。虽然我的回答涵盖了适用于 MySQL 的伪 ANSI SQL 方法,但拥有更多上下文可能会给我们带来潜在的优化。不过,我仍然对您尝试解决的主要问题感兴趣。
  • 我正在使用 msaccess,请参阅下面我的评论以获取大图。简而言之,它是先验算法的一部分

标签: sql


【解决方案1】:

你的建议是 n!长度为 1-n 的所有元素的组合。忽略使用代码生成器创建元素的可能性,您可以为每个组合执行类似的操作(在 MySQL 中):

一项:

SELECT item from ITEM_SET;

两个项目:

SELECT one.item,two.item from ITEM_SET as one, ITEM_SET as two where one.item != two.item;

三个项目:

SELECT one.item,two.item,three.item from ITEM_SET as one, ITEM_SET as two, ITEM_SET as three where one.item != two.item and one.item != three.item and two.item != three.item;

冲洗并重复。为了迂腐,我将 ITEM_SET 定义为我的表名,将 item 定义为我的属性,这是一个更有意义的表组合。

不过,这个问题和相关问题对我来说是代码异味。如果您以编程方式为所有候选答案遍历元素的所有排列,则可能有一个更简单的算法来解决您的问题。鉴于您的other question 与此直接相关,或许您可以提供更多背景信息?

【讨论】:

  • 是的,它是相关的:D 因为对我的其他问题的反应很低,所以我将问题分成较小的堆栈:) 这是大图Data Mining
  • 这里有一些代表。评论走。 ;-) 不错的答案。
  • 非常感谢,保罗。谢谢!
【解决方案2】:

生成组合的最简单算法之一是位计数。
伪代码

N items, indexed 1-N

for i=1 to 2^N-1 
   for each bit in i
      if bit is set, output item[i]

N=4 的示例:

N = 4, 2^4 = 16
i = 1:  binary = 00000001 -> output I1
i = 2:  binary = 00000010 -> output I2
i = 3:  binary = 00000011 -> output I1, I2
i = 4:  binary = 00000100 -> output I3
i = 6:  binary = 00000101 -> output I1, I3
i = 7:  binary = 00000111 -> output I1, I2, I3
i = 8:  binary = 00001000 -> output I4
i = 9:  binary = 00001001 -> output I1, I4
i = 10: binary = 00001010 -> output I2, I4
i = 11: binary = 00001011 -> output I1, I2, I4
i = 12: binary = 00001100 -> output I3, I4
i = 13: binary = 00001011 -> output I1, I2, I4
i = 14: binary = 00001110 -> output I2, I2, I4
i = 15: binary = 00001111 -> output I1, I2, I3, I4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多