表中列的唯一值组合

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 中执行此操作的方法。

以上是关于表中列的唯一值组合的主要内容,如果未能解决你的问题,请参考以下文章

检索任意行以获取数据框中列的唯一组合

用其他表中列的唯一值数填充sql表中的列

R - 给定一个矩阵和一个幂,生成多个矩阵,其中包含矩阵列的所有唯一组合

如何将一个表中列的每个不同值映射到 Hive 中另一个表中列的每个不同值

与 data.table 合并数据以重复唯一值

如何计算表中列的每个值?