2017-07-04 22 views
0

私のユニオンにカスタム・ディメンションを取得しようとしていますが、スカラー・サブ問合せで複数の要素が生成されています。問題はこのコードの中にあると私は信じています。標準SQLに移行しようとしていますので、標準SQLで回答してください。クエリBigQuery:スカラー・サブクエリが複数作成されました - カスタム・ディメンション

#standardSQL 
SELECT 
    date, 
    channelGrouping, 
    viewID, 
    SUM(Revenue) Revenue, 
    SUM(Shipping) Shipping, 
    SUM(bounces) bounces, 
    SUM(transactions) transactions, 
    COUNT(date) sessions 
FROM (
    SELECT 
    date, 
    channelGrouping, 
    'XXXXXXXXX' AS viewID, 
    totals.totaltransactionrevenue/1e6 Revenue, 
    (
    SELECT 
     SUM(hits.transaction.transactionshipping)/1e6 
    FROM 
     UNNEST(hits) hits) Shipping, 
    totals.bounces bounces, 
    totals.transactions transactions 
    FROM 
    `XXXXXXXXX.ga_sessions_*` 
    WHERE 
    _TABLE_SUFFIX BETWEEN '20170625' 
    AND '20170703' 
    UNION ALL 
    SELECT 
    date, 
    channelGrouping, 
    'XXXXXXXXX' AS viewID, 
    totals.totaltransactionrevenue/1e6 Revenue, 
    (
    SELECT 
     SUM(hits.transaction.transactionshipping)/1e6 
    FROM 
     UNNEST(hits) hits) Shipping, 
    totals.bounces bounces, 
    totals.transactions transactions 
    FROM 
    `XXXXXXXXX.ga_sessions_*` 
    WHERE 
    _TABLE_SUFFIX BETWEEN '20170625' 
    AND '20170703' 
    UNION ALL 
    SELECT 
    date, 
    channelGrouping, 
    (
    SELECT 
     d.value 
    FROM 
     UNNEST(hits) AS hits, 
     UNNEST(hits.customDimensions) AS d 
    WHERE 
     d.index = 65) AS viewID, 
    totals.totaltransactionrevenue/1e6 Revenue, 
    (
    SELECT 
     SUM(hits.transaction.transactionshipping)/1e6 
    FROM 
     UNNEST(hits) hits) Shipping, 
    totals.bounces bounces, 
    totals.transactions transactions 
    FROM 
    `XXXXXXXXX.ga_sessions_*` 
    WHERE 
    _TABLE_SUFFIX BETWEEN '20170625' 
    AND '20170703' 
    UNION ALL 
    SELECT 
    date, 
    channelGrouping, 
    'XXXXXXXXX' AS viewID, 
    totals.totaltransactionrevenue/1e6 Revenue, 
    (
    SELECT 
     SUM(hits.transaction.transactionshipping)/1e6 
    FROM 
     UNNEST(hits) hits) Shipping, 
    totals.bounces bounces, 
    totals.transactions transactions 
    FROM 
    `XXXXXXXXX.ga_sessions_*` 
    WHERE 
    _TABLE_SUFFIX BETWEEN '20170625' 
    AND '20170703' 
    UNION ALL 
    SELECT 
    date, 
    channelGrouping, 
    'XXXXXXXXX' AS viewID, 
    totals.totaltransactionrevenue/1e6 Revenue, 
    (
    SELECT 
     SUM(hits.transaction.transactionshipping)/1e6 
    FROM 
     UNNEST(hits) hits) Shipping, 
    totals.bounces bounces, 
    totals.transactions transactions 
    FROM 
    `XXXXXXXXX.ga_sessions_*` 
    WHERE 
    _TABLE_SUFFIX BETWEEN '20170625' 
    AND '20170703') 
GROUP BY 
    date, 
    channelGrouping, 
    viewID 

答えて

2

問題の

SELECT 
     d.value 
FROM 
     UNNEST(hits) AS hits, 
     UNNEST(hits.customDimensions) AS d 
WHERE 
     d.index = 65) AS viewID, 

全体の例では、この問題に対処するには、いくつかの異なる方法があり、一部またはすべてのヒットが65のインデックスを持つカスタム・ディメンションを持っているということです。これはあなたのヒット全体のすべてのビューIDを与える

ARRAY(
    SELECT 
    d.value 
    FROM 
    UNNEST(hits) AS hits, 
    UNNEST(hits.customDimensions) AS d 
    WHERE 
    d.index = 65) AS viewIDs, 

ていますが、労働組合の最初のクエリでのviewIdのための配列を使用する必要があります:あなたは、そのインデックスを持つすべての値を取得するにはARRAYのサブクエリを使用することができます同じように。

(
    SELECT 
    d.value 
    FROM 
    UNNEST(hits[SAFE_OFFSET(0)].customDimensions) AS d 
    WHERE 
    d.index = 65) AS viewID 

それとも、あなたはあなたが得るIDを表示している気にしないならば、あなたは任意のIDを取得するためにLIMITを使用することができます:別のオプションは、ちょうど最初のヒットからのビューIDを取得することです

(
    SELECT 
    d.value 
    FROM 
    UNNEST(hits) AS hits, 
    UNNEST(hits.customDimensions) AS d 
    WHERE 
    d.index = 65 
    LIMIT 1) AS viewID, 
2

ここで何が起こっているのかをよりよく理解するために、BigQueryの一部のデータをシミュレートすることができます。例えば

、このデータはga_sessionshitsスキーマシミュレート:今すぐ

WITH data AS(
    select ARRAY<STRUCT<hitNumber INT64, customDimensions ARRAY<STRUCT<index INT64, value STRING>> >> [STRUCT(1 as hitNumber, [STRUCT(1 as index, 'val1' as value), STRUCT(2 as index, 'val2' as value), STRUCT(3 as index, 'val3' as value)] as customDimensions), STRUCT(2 as hitNumber, [STRUCT(1 as index, 'val1' as value)] as customDimensions)] hits 
) 

select * from data 

をあなたはindex = 1問い合わせるこのシミュレートされたデータに対してクエリを実行した場合、あなたはので、2つの異なる場所で同じエラーを取得しますインデックスは、これが機能するためには、あなたがそうのようなARRAYとしてそれを持参する必要があります。1.

です:

SELECT 
    array(select custd.value from unnest(hits) hits, unnest(hits.customDimensions) custd where index = 1) 
FROM data 

そして、あなたはその結果表示されます:

enter image description here

は、だからあなたのクエリであなたはindex=65値が同じであるすべての値のARRAYまたは、あるかのように、この値を返すのいずれかに適応する必要があります

SELECT 
    (select custd.value from unnest(hits) hits, unnest(hits.customDimensions) custd where index = 1 limit 1) 
FROM data 

このようにすると、スカラーサブクエリの結果は1つだけになります。

+0

いい説明、ウィル!サンプルデータを提供してスクリーンショットを表示していただきありがとうございます。マイナーな提案として、ARRAYサブクエリに余分な括弧は必要ないことに注意してください。 –

+0

コメントありがとう@ElliottBrossard!余分な括弧を削除しました(私はサブクエリで 'ARRAY_AGG'を使い始めた後に余分な括弧を追加することに慣れていました) –

+0

私は今、私にはもっと意味をなさない説明に感謝しています。学ぶたくさん – user3142655

関連する問題