2017-06-06 7 views
0

GoogleアナリティクスでBig Queryにデータをエクスポートしています。それは今caを持っています。 14カ月のデータ、ca. 430mイベント。 1か月あたりのイベントの合計数を取得するためのクエリを実行したい(例:201701、201702など)リソース制限内でBigQueryを使用して月間イベントを取得する

私はクエリを書きましたが、caの間隔でのみ実行されます。 4〜6日。私がそれを大きくすると、「クエリ実行中にリソースが超過しました」というメッセージが表示されます。メッセージ。以下は私の質問です。このクエリを定式化する際、どこで間違っていましたか?それとも、私は完全に異なっこの近づく必要があります(ただ初心者...)

クエリ:

SELECT 
    MonthYear, 
    EXACT_COUNT_DISTINCT(combinedVisitorId) AS EventCount, 
FROM (
    SELECT 
    CONCAT(fullVisitorId,"-",STRING(visitId),"-",STRING(hits.hitNumber)) AS combinedVisitorId, 
    hits.eventInfo.eventCategory AS EventCategory, 
    CONCAT(CAST(YEAR(SEC_TO_TIMESTAMP(visitStartTime)) AS STRING), LPAD(CAST(MONTH(SEC_TO_TIMESTAMP(visitStartTime)) AS STRING), 2, '0')) AS MonthYear, 
    FROM 
    TABLE_DATE_RANGE([XXX:79296192.ga_sessions_], TIMESTAMP("2016-04-01"), TIMESTAMP("2017-05-30")) 
    WHERE 
    hits.type="EVENT") 
GROUP BY 
    MonthYear 
ORDER BY 
    EventCount DESC 

答えて

1

は、以下のようなものを試してみてください - それはBigQueryの標準SQL

#standardSQL 
SELECT 
    YearMonth, 
    COUNT(DISTINCT combinedVisitorId) AS EventCount 
FROM (
    SELECT 
    SUBSTR(_TABLE_SUFFIX, 1, 6) AS YearMonth, 
    CONCAT(fullVisitorId,"-",STRING(visitId),"-",STRING(hits.hitNumber)) AS combinedVisitorId 
    FROM `XXX.79296192.ga_sessions_*` 
    WHERE _TABLE_SUFFIX BETWEEN "20160401" AND "20170530" 
    AND hits.type="EVENT" 
) 
GROUP BY YearMonth 
-- ORDER BY EventCount DESC 

注用です私はcombinedVisitorIdのロジックを残しました。これは訪問者を処理する方法とまったく同じであると仮定しています
また、上記のものを1つのselectステートメント(サブクエリなし)に組み合わせることもできますtワイルドカードを使用してアプローチを強調するために意図的にこのように記述しました

+0

このクエリは実行されません: 'ARRAY [10:12]の値のフィールド型にアクセスできません。いくつかのfurthger実験、そのトリックがCOUNT(DISTINCT)であることを発見しましたか? –

1

BigQueryでStandard SQLバージョンを使用することを強くお勧めします。あなたは、合計イベントを計算したい場合は、これはあなたのためにトリックを行う可能性があります:

SELECT 
    SUM((SELECT COUNTIF(hits.type = 'EVENT') FROM UNNEST(hits) hits)) total_events, 
FORMAT_DATE("%B", PARSE_DATE("%Y%m%d", date)) month 
FROM `project_id.dataset_id.ga_sessions*` 
WHERE 
1 = 1 
AND CASE WHEN (REGEXP_CONTAINS(_table_suffix, 'intraday') AND REGEXP_EXTRACT(_table_suffix, r'.*_(.*)') BETWEEN "20170606" AND "20170606") THEN TRUE 
    WHEN (NOT REGEXP_CONTAINS(_table_suffix, 'intraday') AND REGEXP_EXTRACT(_table_suffix, r'.*_(.*)') BETWEEN "20160605" AND "20170605") THEN TRUE END 
GROUP BY month 

私はここで全体の年でテストし、それは約30秒で処理。ただし、1年以上使用すると、同じ月にデータがグループ化されます。

関連する問題