我想将以下两个表中的条目组合起来,通过obj
将class
与attr
进行匹配。
我在一个表中有许多具有不同名称,日期和其他信息的对象(未显示)。这些对象中的每一个都可以根据其属性归入类中。对象obj
到其每个属性attr
的映射在表A中。类class
到属性attr
的映射在表B中。
我想将每个对象obj
映射到其匹配的类class
,以提供表C中所示的所需输出。
在某些方面,这似乎是对群组的连接操作。有没有办法在标准sql和/或Google BigQuery中执行此操作?
重点 - attr
和class
的{{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
。)
答案 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