加入 multiple/group 个条目

join on multiple/group of entries

我想合并下面两个 table 的条目以通过 attr 匹配 objclass

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

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

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

重要的一点 -- classobjattr 都没有排序。

Table答:

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

Table乙:

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

期望的输出(Table C):

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

(注意obj3不属于classA因为它多了一个IIattr。)

以下适用于 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