加入 multiple/group 个条目
join on multiple/group of entries
我想合并下面两个 table 的条目以通过 attr
匹配 obj
到 class
。
我在单个 table(未显示)中有许多具有不同名称、日期和其他信息的对象。这些对象中的每一个都可以根据它们的属性属于 classes。对象 obj
到它们每个属性 attr
的映射在 Table A 中。classes class
到属性 attr
的映射是在 Table B.
我想将每个对象 obj
映射到其匹配的 class class
以提供 Table C 中显示的所需输出。
在某些方面,这似乎是对组的加入操作。有没有办法在标准 sql and/or 和 Google BigQuery 中做到这一点?
重要的一点 -- class
和 obj
的 attr
都没有排序。
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
不属于class
A
因为它多了一个II
attr
。)
以下适用于 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
我想合并下面两个 table 的条目以通过 attr
匹配 obj
到 class
。
我在单个 table(未显示)中有许多具有不同名称、日期和其他信息的对象。这些对象中的每一个都可以根据它们的属性属于 classes。对象 obj
到它们每个属性 attr
的映射在 Table A 中。classes class
到属性 attr
的映射是在 Table B.
我想将每个对象 obj
映射到其匹配的 class class
以提供 Table C 中显示的所需输出。
在某些方面,这似乎是对组的加入操作。有没有办法在标准 sql and/or 和 Google BigQuery 中做到这一点?
重要的一点 -- class
和 obj
的 attr
都没有排序。
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
不属于class
A
因为它多了一个II
attr
。)
以下适用于 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