加入多个/一组条目

时间:2017-11-18 22:38:47

标签: database google-bigquery standard-sql

我想将以下两个表中的条目组合起来,通过objclassattr进行匹配。

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

我想将每个对象obj映射到其匹配的类class,以提供表C中所示的所需输出。

在某些方面,这似乎是对群组的连接操作。有没有办法在标准sql和/或Google BigQuery中执行此操作?

重点 - attrclass的{​​{1}}均未订购。

表A:

obj

表B:

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

期望的输出(表C):

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

(请注意,----------------------- | obj | class | ----------------------- | obj1 | A | | obj2 | A | | obj4 | B | ----------------------- 不属于obj3 class,因为它还有A II。)

1 个答案:

答案 0 :(得分:2)

以下是BigQuery Standard 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