2017-11-18 10 views
0

objからclassまでattrで一致させるために、以下の2つのテーブルのエントリを組み合わせたいとします。複数の/エントリのグループに参加する

名前、日付、およびその他の情報が異なる多くのオブジェクトが1つのテーブル(図示せず)にあります。これらのオブジェクトのそれぞれは、その属性に基づいてクラスに分類できます。それらの属性のそれぞれattrにオブジェクトobjのマッピングは、表Aに属性attrにクラスclassのマッピングは、Iが所望を与えるために、そのマッチングクラスclassに各オブジェクトobjをマップしたい表B

になっています

いくつかの点で、これはグループの結合操作のようです。標準SQLやGoogle BigQueryでこれを行う方法はありますか?

重要な点 - attrclassobjの両方です。

表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がのでclassAに該当しないことに注意してくださいそれはさらにIIattr 。)

以下
+0

私はまだアルゴリズムを理解していません。多分誰かが助けることができるでしょう。 –

答えて

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  
関連する問題