0

我想将下面两个表中的条目组合起来以obj匹配classvia attr

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

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

在某些方面,这似乎是对组的加入操作。有没有办法在标准 sql 和/或 Google BigQuery 中做到这一点?

重要的一点—— attraclass和 of anobj都没有排序。

表 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    |
-------------------

期望的输出(表 C):

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

(请注意,obj3它不属于,class A因为它有一个额外的II attr。)

4

1 回答 1

2

以下是 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    
于 2017-11-19T00:09:53.593 回答