0

グループに JavaScript ユーザー定義関数を適用しようとしています。次のコードでは、 -- group by my_groupwithintupleがコメント アウトされています。内のtestすべてにtemp関数を適用したい。group by がコメントアウトされている場合、コードが実行されます。group by を含めようとすると、「複数の要素を生成したスカラー サブクエリ」が生成されます。グループ ( ) ごとに配列を出力できるようにするには、どのような変更を加える必要がありますか?my_grouptest_datamy_group

#standardSQL create function
CREATE TEMP FUNCTION test(a ARRAY<STRING>) 
RETURNS ARRAY< STRING >
LANGUAGE js AS '''
  var combine = function(a) {
    var fn = function(n, src, got, all) {
      if (n == 0) {
        if (got.length > 0) {
          all[all.length] = got;
        } return;
      }
      for (var j = 0; j < src.length; j++) {
        fn(n - 1, src.slice(j + 1), got.concat([src[j]]), all);
      } return;
    }
    var all = [];
    for (var i = 1; i < a.length; i++) {
      fn(i, a, [], all);
    }
    all.push(a);
    return all;
  } 
  return combine(a)
''';

 WITH test_data AS (
  SELECT  'Shirt' item, 'Cashless' my_group UNION ALL
  SELECT  'Jeans', 'Cashless' UNION ALL
  SELECT  'Jeans', 'Cash' UNION ALL
  SELECT  'Cap', 'Cash' UNION ALL
  SELECT  'Shirt', 'Cash' UNION ALL
  SELECT  'Cap', 'Cashless'

),

tuple as (  
  SELECT ARRAY_AGG(DISTINCT item) items
  FROM test_data

  --group by my_group (uncommenting it creates error)
)

select * from unnest(test((select items from tuple)))

次のような出力を探しています。

my_group    Item
Cash        Shirt
Cash        Jeans
Cash        Cap
Cash        Shirt,Jeans
Cash        Shirt,Cap
Cash        Jeans,Cap
Cash        Shirt,Jeans,Cap
Cashless    Shirt
Cashless    Jeans
Cashless    Cap
Cashless    Shirt,Jeans
Cashless    Shirt,Cap
Cashless    Jeans,Cap
Cashless    Shirt,Jeans,Cap
4

1 に答える 1