代码之家  ›  专栏  ›  技术社区  ›  saladi Veedrac

加入多个/一组条目

  •  0
  • saladi Veedrac  · 技术社区  · 7 年前

    我想将下面两个表中的条目合并以匹配 obj class 通过 attr .

    我在一个表(未显示)中有许多具有不同名称、日期和其他信息的对象。这些对象中的每一个都可以根据其属性归入类。对象的映射 obj公司 它们的每个属性 属性 在表A中。类的映射 到属性 属性 在表B中。

    我想映射每个对象 obj公司 到其匹配类 给出表C中所示的期望输出。

    在某些方面,这似乎是一种群体的联合行动。有没有办法在标准sql和/或Google BigQuery中做到这一点?

    重要的一点——两者都是 属性 obj公司

    表A:

    -------------------
    |  obj  |  attr   | 
    -------------------
    |  obj1 |     I   |
    |  obj1 |     II  |  
    |  obj2 |     I   |
    |  obj2 |     II  |
    |  obj3 |     I   |
    |  obj3 |     II  |  
    |  obj3 |     II  |
    |  obj4 |     III |
    |  obj4 |     I   |
    -------------------
    

    表B:

    -------------------
    | attr  |  class  | 
    -------------------
    |  I    |    A    |
    |  II   |    A    |  
    |  I    |    B    |
    |  III  |    B    |
    -------------------
    

    -----------------------
    |  obj     |  class   | 
    -----------------------
    |  obj1    |    A     |
    |  obj2    |    A     |
    |  obj4    |    B     |
    -----------------------
    

    (请注意 obj3 不属于 A II 属性 .)

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mikhail Berlyant    7 年前

    下面是BigQuery标准SQL

    #standardSQL
    SELECT obj, class FROM (
      SELECT obj, STRING_AGG(attr ORDER BY attr) attr
      FROM `project.dataset.TableA`
      GROUP BY obj
    ) JOIN (
      SELECT class, STRING_AGG(attr ORDER BY attr) attr
      FROM `project.dataset.TableB`
      GROUP BY class
    ) USING(attr)  
    

    您可以使用问题中的虚拟数据测试/玩它,如下所示

    #standardSQL
    WITH `project.dataset.TableA` AS (
      SELECT 'obj1' obj, 'I' attr UNION ALL
      SELECT 'obj1', 'II' UNION ALL
      SELECT 'obj2', 'I' UNION ALL
      SELECT 'obj2', 'II' UNION ALL
      SELECT 'obj3', 'I' UNION ALL
      SELECT 'obj3', 'II' UNION ALL
      SELECT 'obj3', 'II' UNION ALL
      SELECT 'obj4', 'III' UNION ALL
      SELECT 'obj4', 'I' 
    ), `project.dataset.TableB` AS (
      SELECT 'I' attr, 'A' class UNION ALL
      SELECT 'II', 'A' UNION ALL
      SELECT 'I', 'B' UNION ALL
      SELECT 'III', 'B' 
    )
    SELECT obj, class FROM (
      SELECT obj, STRING_AGG(attr ORDER BY attr) attr
      FROM `project.dataset.TableA`
      GROUP BY obj
    ) JOIN (
      SELECT class, STRING_AGG(attr ORDER BY attr) attr
      FROM `project.dataset.TableB`
      GROUP BY class
    ) USING(attr)   
    

    输出为:

    obj     class    
    ----    -----
    obj1    A    
    obj2    A    
    obj4    B