在sql中生成数据组合

Posted

技术标签:

【中文标题】在sql中生成数据组合【英文标题】:Generate data combinations in sql 【发布时间】:2020-12-15 15:22:20 【问题描述】:

我有一张如下表 -

COL1 COL2
101 A
102 B
102 C
102 D
103 C
103 E

我需要为 COL1 中的一组唯一值生成所有可能的组合以及 uniqueID,如下所示 - COL1 中有 3 个唯一值,可以有 6 种组合,因此结果中应该有 18 行。

1,101,A
1,102,B
1,103,C
2,101,A
2,102,B
2,103,E
3,101,A
3,102,C
3,103,C
4,101,A
4,102,C
4,103,E
5,101,A
5,102,D
5,103,C
6,101,A
6,102,D
6,103,E

请帮助并提出答案。我尝试使用LAG,LEAD,CROSS JOIN,无法找到解决方案。

答案可以使用任何 HANA SQL 脚本或 Oracle SQL 或 MS-SQL。我有一个适用于 COL1 中固定数量的唯一值的解决方案,但是我需要该解决方案是动态的,并且应该适用于任意数量的组合和值。

【问题讨论】:

“我尝试使用LAG,LEAD,CROSS JOIN,无法找到解决方案。”那些尝试?为什么他们不工作? 这些组合是如何产生的? 1,101,A 1,102,B 1,103,C @VenkataramanR - 我需要一个 SQL 代码来生成这些组合。这就是我要求的帮助。 我的疑问是,为什么只考虑 102,B 而不是 102,C 或 102,D ? @VenkataramanR - 他们被考虑了。见最后两种组合。 ABC、ABE、ACC、ACE、ADC、ADE 【参考方案1】:

这回答了问题的原始版本。

如果我理解正确,我认为最简单的方法是将值放在一行中:

select row_number() over (order by t1.col1, t2.col1, t3.col1),
       t1.col1, t1.col2,
       t2.col1, t2.col2,
       t3.col1, t3.col2
from t t1 join
     t t2
     on t1.col1 < t2.col1 join
     t t3
     on t2.col1 < t3.col1;

如果愿意,您可以取消透视这些结果。

【讨论】:

一个小改动奏效了。 select row_number() over (order by t1.col1, t2.col1, t3.col1), t1.col1, t1.col2, t2.col1, t2.col2, t3.col1, t3.col2 from t t1 join t t2在 t1.col1 由于只有 3 个列,我可以使用 UNION ALL 进行旋转。谢谢,戈登。 如果我在 COL1 中只有 3 个唯一值,上面的代码会有所帮助,但是我需要动态解决方案,并且应该使用任意数量的组合和值 @Gowthi 。 . .这回答了您在此处提出的问题。如果您有其他问题,请作为新问题提出。 我更新了我的问题@gordon linoff,请您现在回答。请帮忙,谢谢!!【参考方案2】:

您可以在行的不同值之间进行笛卡尔积

select *
    from (select distinct COL1
          from yourTable) as t1,
         (select distinct COL2
          from yourTable) as t2

【讨论】:

不,它不会像这样工作。组合的数量取决于 COL1 中的不同值以及 COL1 中每个值在 COL2 中存在的值。普通笛卡尔积无法解决我的问题,任何其他想法都值得赞赏,谢谢!!

以上是关于在sql中生成数据组合的主要内容,如果未能解决你的问题,请参考以下文章

如何在块中生成组合

在jsp中生成动态组合框

Javascript - 在单个数组中生成所有元素组合(成对)

在python中生成组合

在目标c中生成组合的有效方法[重复]

在Matlab中生成包含给定集合中至少一个元素的所有组合