如何获得表的排列?
Posted
技术标签:
【中文标题】如何获得表的排列?【英文标题】:How to get permutation of a table? 【发布时间】:2020-05-18 11:41:20 【问题描述】:我有一张有 10 列的表。我想得到所有可能的排列。具有 3 列的表的示例:
col1 col2 col3
10 40 3,
20 6 1,
排列表将是:
col1 col2 col3
10 40 3,
10 40 1,
10 6 3,
10 6 1,
20 6 1,
20 6 3,
20 40 3,
20 40 1,
我尝试使用 CROSS JOIN 来实现,但没有成功。 最好的方法是什么?
谢谢!
【问题讨论】:
如果某些列中有重复项,您要区分它们吗?即在显示的数据中 - 如果两条记录的 col3=3,最终结果是否必须包含 4 条或 8 条记录? 是的,我希望结果是独一无二的。如果在显示的数据中 col3=3 对于两条记录,最终结果将是 4 条记录。感谢您的快速回复:) 如果是这样,那么Gordon Linoff 可以解决您的任务。测试它并标记为解决方案。 【参考方案1】:您可以使用cross join
:
select c1.col1, c2.col2, c3.col3
from (select distinct col1 from t) c1 cross join
(select distinct col2 from t) c2 cross join
(select distinct col3 from t) c3
order by c1.col1, c2.col2, c3.col3;
Here 是一个 dbfiddle。
【讨论】:
感谢戈登·林诺夫的帮助。我有一个问题- write: SELECT DISTINCT c1.col1, c2.col2, c3.col3 FROM c1 cross join c2 cross join c3 ORDER BY c1.col1, c2.col2, c3.col3 之间有什么区别;给你回答? (它们都有相同的输出)。谢谢你:) @s.r 。 . .这也有效。事实上,对于您的示例数据,您不需要distinct
。但是,如果您在任何列中有重复值,您的版本会做更多的工作 - 生成比需要更多的行,然后删除重复项。以上是关于如何获得表的排列?的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery:按开始日期和结束日期描述的用户元数据 - 创建跨多个表的排列