2017-02-23 5 views
-1

Bigqueryのstandardsql構文の質問でちょっとお手伝いできますか? 私はなぜこの問題を解決しようとしていますが、この標準SQLクエリは2行を返しますが、このlegacysqlは1を返します(そして私はただ1つしか期待しません)。Bigqueryのstandardsqlが複数の行を返すのはなぜですか?legacysqlは1つだけですか?

StandardSQL

SELECT 
    hits2.transaction.transactionId as transactionId 
    FROM `ga-export-TTTT.1234567890.ga_sessions_*` 
    ,UNNEST (hits) as hits2 

WHERE 
hits2.transaction.transactionId = '03971163' 

LegacySQL

select 
hits.transaction.transactionId 
FROM 
TABLE_DATE_RANGE([ga-export-TTTT:1234567890.ga_sessions_], TIMESTAMP('2016-09-01'), TIMESTAMP('2017-02-14')) 
WHERE 
hits.transaction.transactionId = '03971163' 

ヘルプを読んだ後、私はまた、結果には同じ2つの行で、このStandardSQL 1を試してみました:

select 
title 
from 
(
    SELECT 
    ARRAY(SELECT transaction.transactionId FROM UNNEST(hits) 
      WHERE transaction.transactionId = '03971163') AS title 
    FROM `ga-export-TTTTT.1234567890.ga_sessions_*` 
) 
WHERE ARRAY_LENGTH(title) > 0; 

これに関する助けに感謝します。

答えて

0

代わりにこれを試してください:あなたは、配列でCROSS JOINを使用する場合

#standardSQL 
SELECT 
    ARRAY(SELECT transaction.transactionId 
     FROM UNNEST(hits) 
     WHERE transaction.transactionId = '03971163') 
    AS transactionIds 
FROM `ga-export-TTTT.1234567890.ga_sessions_*`; 

は、あなたがすべての配列要素に対して結果の行を取得します。テーブルの行と1対1の対応が必要な場合は、配列サブクエリ(上記のクエリのように)を使用して、フィルタを適用した後に配列要素を「再パッケージ化」することができます。別の例として、あなたはSELECT AS STRUCTと一緒にARRAYサブクエリを使用することができます。

#standardSQL 
SELECT 
    ARRAY(SELECT AS STRUCT transaction.* 
     FROM UNNEST(hits) 
     WHERE transaction.transactionId = '03971163') 
    AS transactions 
FROM `ga-export-TTTT.1234567890.ga_sessions_*`; 

これはtransaction.transactionId = '03971163'の条件に合致するヒットためtransaction内のすべてのフィールドの配列を返します。あなただけの配列の1つの要素が必要な場合は、代わりにLIMITで選択リストにサブクエリを使用することができます。

#standardSQL 
SELECT 
(SELECT transaction.transactionId 
    FROM UNNEST(hits) 
    WHERE transaction.transactionId = '03971163' 
    LIMIT 1) 
    AS transactionId 
FROM `ga-export-TTTT.1234567890.ga_sessions_*`; 

または:

#standardSQL 
SELECT 
(SELECT transaction 
    FROM UNNEST(hits) 
    WHERE transaction.transactionId = '03971163' 
    LIMIT 1) 
    AS transaction 
FROM `ga-export-TTTT.1234567890.ga_sessions_*`; 
+0

おかげ@Elliottと同じリストにテーブルをフィルタリングするには、以下試してみてください。残念ながら、これは動作しません。どちらの例も、膨大な量の行を返しますが、ただ1つでなければなりません。 – user912830823

+0

私が提供したクエリは、あなたが求めたものであるトランザクションIDと一致する配列のすべての要素を返します。配列の要素を1つだけ使用したい場合は、代わりに 'LIMIT'を使います。私の編集を参照してください。 –

+0

ちょっと@Elliot、私の質問は、私がlegacysqlを使って得たものと似た結果を得る方法に関するものでした。この場合、Limit 1を使用することはできません。 – user912830823

0

唯一の違いを、あなたの2つのクエリに(用レガシーと標準SQLのバージョン)私は、潜在的に異なるテーブルのセットを照会することです!レガシーSQLバージョンで

- 標準SQLにはあなたがすべてのga_sessions_のテーブルを照会に対し、あなたはTIMESTAMP(「2017年2月14日」)までTIMESTAMP(「2016年9月1日」)からの時間のためのテーブルのリストを制限ga-export-TTTT.1234567890データセット

レガシーSQL

#standardSQL 
SELECT hits2.transaction.transactionId as transactionId 
FROM `ga-export-TTTT.1234567890.ga_sessions_*`, UNNEST (hits) as hits2 
WHERE hits2.transaction.transactionId = '03971163' 
AND _TABLE_SUFFIX BETWEEN '20160901' AND '20170214' 
関連する問題