2017-04-21 5 views
0

私のデータは、現在、次のようになります。
Initial dataBigQueryで文字列から値を抽出し、位置番号を割り当てる方法は?

マイ所望の出力がこれです:
New data format

希望の成果は以下のとおりです。

  • はOrderDescriptionでの.csv文字列の値を抽出します。
  • 正規化されたテーブルにそれらを表示し、元のデータの.csv文字列に表示された順序であるOrderDescriptionPositionを割り当てます。

これは、split関数をrow_numberと組み合わせて使用​​して行っています。これは顧客ごとに動作するように見えますが、複数の顧客にまたがって実行しているときには、信頼性の低い「シャッフル」されたrow_numbersを返すようです。

select 
    CustomerID, 
    OrderID, 
    OrderDescriptionItem,    
    row_number() over(partition by CustomerID, OrderID) as OrderDescriptionPosition 
from 
(
    select 
     CustomerID, 
     OrderID,   
     split(OrderDescription, ',') as OrderDescriptionItem 
    from 
     InitialTable 
) as e 
,unnest(OrderDescriptionItem) as OrderDescriptionItem 

誰かがより堅牢なソリューションを持っていますか? UDFとjavascriptの使用に関する提案は大歓迎です。

答えて

1

UNNESTと組み合わせてWITH OFFSETを使用すると、ポジションを取得できます。次に例を示します。

場合
#standardSQL 
WITH Input AS (
    SELECT 1 AS CustomerID, 1001 AS OrderID, '12,14,16,22,28' AS OrderDescription UNION ALL 
    SELECT 2 AS CustomerID, 1002 AS OrderID, '1,5' AS OrderDescription UNION ALL 
    SELECT 3 AS CustomerID, 1003 AS OrderID, '44,55,66' AS OrderDescription 
) 
SELECT 
    CustomerID, 
    OrderID, 
    OrderDescription, 
    off + 1 AS OrderDescriptionPosition 
FROM Input 
CROSS JOIN UNNEST(SPLIT(OrderDescription)) AS OrderDescription 
    WITH OFFSET off; 
+------------+---------+------------------+--------------------------+ 
| CustomerID | OrderID | OrderDescription | OrderDescriptionPosition | 
+------------+---------+------------------+--------------------------+ 
| 1   | 1001 | 12    | 1      | 
| 1   | 1001 | 14    | 2      | 
| 1   | 1001 | 16    | 3      | 
| 1   | 1001 | 22    | 4      | 
| 1   | 1001 | 28    | 5      | 
| 2   | 1002 | 1    | 1      | 
| 2   | 1002 | 5    | 2      | 
| 3   | 1003 | 44    | 1      | 
| 3   | 1003 | 55    | 2      | 
| 3   | 1003 | 66    | 3      | 
+------------+---------+------------------+--------------------------+ 
0

問題のあなたの例は、(OrderDescriptionは値の順序付けられたリストであるという意味で)あなたの本当のユースケースを表している場合 - あなたは、ほとんどであるとして、クエリのバージョンを使用することができます - ちょうどあなたのフィードバックミハイルため

#standardSQL 
WITH InitialTable AS (
    SELECT 1 AS CustomerID, 1001 AS OrderID, '12,14,16,22,28' AS OrderDescription UNION ALL 
    SELECT 2, 1002, '1,5' UNION ALL 
    SELECT 3, 1003, '44,55,66' 
) 
SELECT 
    CustomerID, 
    OrderID, 
    OrderDescription, 
    ROW_NUMBER() OVER(PARTITION BY CustomerID, OrderID ORDER BY OrderDescription) AS OrderDescriptionPosition 
FROM InitialTable, UNNEST(SPLIT(OrderDescription)) AS OrderDescription 
-- ORDER BY CustomerID, OrderID, OrderDescriptionPosition 
+0

おかげで以下のように)内部OVER(ORDER BYを追加します。たぶん私は私の例では、 "OrderDescription"の順序が常に昇順ではなく、.csv文字列内の位置が非常に重要であることを明確にすべきであろう。 OrderDescription =(6、1、400、43)は、2つの列を返す必要があります。 OrderDescription [6,1,400,43]およびOrde​​rDescriptionPosition [1、2、3、4] – user7899351

関連する問題