表中列的唯一值组合
Posted
技术标签:
【中文标题】表中列的唯一值组合【英文标题】:combination of unique values a column in a table 【发布时间】:2013-09-28 05:05:49 【问题描述】:我需要在表的列中找到所有唯一可能的值组合。例如,对于列值 1、2、3、4、5。我希望结果是 [1,2],[1,3],[1,4],[1,5],[2,1],[2,3] 等。
将感谢任何构造查询以查找值组合的指针。
谢谢
【问题讨论】:
【参考方案1】:您可以在 BigQuery 中进行交叉联接,方法是使用添加常量键值的子选择,然后加入该常量值。
例如,这是一个计算 1, 2, 3 和 2, 4, 6 的交叉连接的查询:
SELECT t1.num as first, t2.num as second
FROM (
SELECT num, 1 as key
FROM (
SELECT 1 as num), (
SELECT 2 as num), (
SELECT 3 as num)) as t1
JOIN (
SELECT num, 1 as key
FROM (
SELECT 2 as num), (
SELECT 4 as num), (
SELECT 6 as num)) as t2
ON t1.key = t2.key
WHERE t1.num <> t2.num
请注意,这使用 BigQuery“技巧”来创建两个输入表。如果您只是对现有表执行此操作,它看起来像:
SELECT t1.num as first, t2.num as second
FROM (
SELECT foo as num, 1 as key
FROM [my_dataset.my_table]) as t1
JOIN (
SELECT foo as num, 1 as key
FROM [my_dataset.my_table]) as t2
ON t1.key = t2.key
WHERE t1.num <> t2.num
【讨论】:
【参考方案2】:cross join
可能有用。
看这个演示:http://www.sqlfiddle.com/#!12/59af5/1
ANSI SQL 语法使用CROSS JOIN
运算符:
create table val( x int );
insert into val values(1),(2),(3),(4),(5);
SELECT a.x a, b.x b
FROM val a
CROSS JOIN val b
WHERE a.x <> b.x
ORDER BY a,b;
不带CROSS JOIN
的此查询的另一种形式应该适用于大多数 DBMS 系统,但为了清晰起见,建议使用 ANSI 形式:
SELECT a.x a, b.x b
FROM val a, val b
WHERE a.x <> b.x
ORDER BY a,b;
请注意,大型数据集的交叉连接会影响您的数据库性能,对于 100 个值,它会生成 100x100 = 10.000 行,对于 1000 --> 1.000.000 行。
【讨论】:
感谢您的回复 kordirko。我正在寻找一种在 google bigquery 中执行此操作的方法。以上是关于表中列的唯一值组合的主要内容,如果未能解决你的问题,请参考以下文章
R - 给定一个矩阵和一个幂,生成多个矩阵,其中包含矩阵列的所有唯一组合