在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中生成数据组合的主要内容,如果未能解决你的问题,请参考以下文章