【问题标题】:Generate combinations in SQL在 SQL 中生成组合
【发布时间】:2021-10-30 12:01:27
【问题描述】:

我正在尝试编写一个选择查询来填充多个变量的所有组合。

我的数据格式如下

______________________________
|    Variable    |    Value    |
|----------------|-------------|
| variable_one   | var_1_val_1 |
| variable_one   | var_1_val_2 |

| variable_two   | var_2_val_1 |
| variable_two   | var_2_val_2 |

| variable_three | var_3_val_1 |
| variable_three | var_3_val_2 |
-------------------------------

注意:我有可变数量的变量和可变数量的每个变量的值(即:查询不应依赖于变量的数量或其值)。

我需要单个选择查询或可以将输出加载到临时表(即:带有循环)的查询,这些变量值的所有组合采用以下格式,必须随时生成组合 ID 以表示每个组合。

_________________________________________________
| CombinationID  |    Variable    |    Value    |
|----------------|----------------|-------------|
| comb_1         | variable_one   | var_1_val_1 |
| comb_1         | variable_two   | var_2_val_1 | 
| comb_1         | variable_three | var_3_val_1 |

| comb_2         | variable_one   | var_1_val_1 |
| comb_2         | variable_two   | var_2_val_1 |
| comb_2         | variable_three | var_3_val_2 |

| comb_3         | variable_one   | var_1_val_1 |
| comb_3         | variable_two   | var_2_val_2 | 
| comb_3         | variable_three | var_3_val_1 |

| comb_4         | variable_one   | var_1_val_1 |
| comb_4         | variable_two   | var_2_val_2 | 
| comb_4         | variable_three | var_3_val_2 |

| comb_5         | variable_one   | var_1_val_2 |
| comb_5         | variable_two   | var_2_val_1 | 
| comb_5         | variable_three | var_3_val_1 |

| comb_6         | variable_one   | var_1_val_2 |
| comb_6         | variable_two   | var_2_val_1 |
| comb_6         | variable_three | var_3_val_2 |

| comb_7         | variable_one   | var_1_val_2 |
| comb_7         | variable_two   | var_2_val_2 | 
| comb_7         | variable_three | var_3_val_1 |

| comb_8         | variable_one   | var_1_val_2 |
| comb_8         | variable_two   | var_2_val_2 | 
| comb_8         | variable_three | var_3_val_2 |
-------------------------------------------------

我知道这可以在应用程序级别相对容易地完成,但是我得到了十几个变量,每个变量都有几个值,它们最终都是数百万个组合。在应用程序级别做起来真的很慢。

  • 更新 这是在 MSSQL 上,但如果另一个 DBMS 让生活更轻松,我很乐意切换。

【问题讨论】:

  • 具体的数据库是什么?这在 PosgreSQL 中可能是可能的。
  • @The Impaler,这是在 MSSQL 上,但如果另一个 DBMS 让生活更轻松,我很乐意切换。
  • 带有自连接的交叉连接(笛卡尔积)正在做这样的事情。不知道我怎么能做 CombinationID 字段虽然

标签: sql combinations


【解决方案1】:

组合是 hard 部分?(P.S. 这里没有“hard”的定义)

CREATE TABLE Table1 (
   Variable VARCHAR(20),
   Value    VARCHAR(20));

INSERT INTO Table1 VALUES
( 'variable_one'   , 'var_1_val_1'),
( 'variable_one'   , 'var_1_val_2'),

( 'variable_two'   , 'var_2_val_1'),
( 'variable_two'   , 'var_2_val_2'),

( 'variable_three' , 'var_3_val_1'),
( 'variable_three' , 'var_3_val_2');


Select 
   x.Variable,
   y.Value
   --,X.R
   --,y.R
   ,ROW_NUMBER() OVER (ORDER By x.Variable,x.R) - 
       ((ROW_NUMBER() OVER (ORDER By x.Variable,x.R)-1)%(select count(distinct Variable) from Table1))  as CombinationID
FROM (Select 
        Variable,
        DENSE_RANK() OVER (order by Variable) as R
      from TAble1) x
CROSS JOIN (Select 
        Value 
        ,ROW_NUMBER() OVER (order by Value) as R
      from Table1) y
order by 3

在输出中,CombinationID 是一个唯一值,但不会以 1 递增。

输出:

Variable Value CombinationID
variable_one var_1_val_1 1
variable_one var_1_val_2 1
variable_one var_2_val_1 1
variable_one var_2_val_2 4
variable_one var_3_val_1 4
variable_one var_3_val_2 4
variable_one var_1_val_1 7
variable_one var_1_val_2 7
variable_one var_2_val_1 7
variable_one var_2_val_2 10
variable_one var_3_val_1 10
variable_one var_3_val_2 10
variable_three var_1_val_1 13
variable_three var_1_val_2 13
variable_three var_2_val_1 13
variable_three var_2_val_2 16
variable_three var_3_val_1 16
variable_three var_3_val_2 16
variable_three var_1_val_1 19
variable_three var_1_val_2 19
variable_three var_2_val_1 19
variable_three var_2_val_2 22
variable_three var_3_val_1 22
variable_three var_3_val_2 22
variable_two var_1_val_1 25
variable_two var_1_val_2 25
variable_two var_2_val_1 25
variable_two var_2_val_2 28
variable_two var_3_val_1 28
variable_two var_3_val_2 28
variable_two var_1_val_1 31
variable_two var_1_val_2 31
variable_two var_2_val_1 31
variable_two var_2_val_2 34
variable_two var_3_val_1 34
variable_two var_3_val_2 34

见:DBFIDDLE

【讨论】:

  • 我认为你在正确的轨道上,但这不是 OP 正在寻找的结果集;应该有 8 个不同的 3 个值集(24 行),您有两个重复的 3 个值集(1.1、1.2、2.1 和 2.2、3.1、3.2)。
  • @dogyog:仔细一看确实有错误……组合25和31是一样的,还有一些组合也是double?
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2011-03-11
  • 2012-03-14
  • 1970-01-01
相关资源
最近更新 更多