【问题标题】: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] 等。

将感谢任何构造查询以查找值组合的指针。

谢谢

【问题讨论】:

    标签: sql google-bigquery


    【解决方案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 中执行此操作的方法。
      猜你喜欢
      • 2019-05-25
      • 1970-01-01
      • 2014-12-11
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多