7

Google アナリティクスの BigQuery テーブルは次のように構成されています (従来の SQL 表記 - 関連するフィールドのみが表示されます)。

visitId:                      INTEGER
hits:                         RECORD/REPEATED
hits.hour:                    INTEGER

そのようなテーブルの 1 つで、次のクエリがうまく機能します。

SELECT
  visitId,
  MIN(h.hour) AS firstHitHour
FROM
  `my-table.ga_sessions_20161122`, UNNEST(hits) AS h
GROUP BY
  visitId

ただし、次の代替構文を使用します。

SELECT
  visitId,
  (SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour
FROM
  `my-table.ga_sessions_20161122`
GROUP BY
  visitId

次のエラーをトリガーします。

エラー: UNNEST 式は、グループ化も集計もされていない列ヒットを参照しています

UNNEST(hits)何らかの形でグループ化または集計する必要があることは理解していますが、この列は であるためarray (repeated)、正確にはどういう意味ですか?

hits要求に応じて、次のように「列をグループ化」しようとすると、次のようになります。

(SELECT MIN(hour) FROM UNNEST(hits) as h GROUP BY h) as firstHitHour

その後、Grouping by expressions of type STRUCT is not allowedエラーが発生します。

この代替構文を修正して、最初の構文と同じ結果を得るにはどうすればよいでしょうか?

4

2 に答える 2

9

私の最初の回答は、この質問の元のバージョンです。
私が答えたとき、私はあなたがそれをまったく別のものに変更したことに気づきました:o)

したがって、以下の回答は、質問の最新バージョンです。

「代替」バージョンでは、元の(フラット化されていない)行ごとに操作し、各行(visitId)に対してfirstHitHourを計算するため、GROUP BYはまったく必要ないと思います

SELECT
  visitId,
  (SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour
FROM
  `my-table.ga_sessions_20161122`

最初のクエリでは、行ごとにすべてのレコードをフラット化するようなものです。そのため、それらをグループ化する必要があります

于 2016-11-24T21:24:20.747 に答える
5

以下を試してください(元の質問の例を使用しています):

SELECT
  visitId, source, medium, browser,
  MIN(hour) AS firstHitHour,
  LOGICAL_OR(hasValue) AS hasValue
FROM (
  SELECT
    visitId,
    trafficSource.source AS source,
    trafficSource.medium AS medium,
    device.browser AS browser,
    h.hour AS hour,
    EXISTS(SELECT 1 FROM UNNEST(hits) WHERE eventInfo.eventCategory = "SomeValue") AS hasValue
  FROM
   `my-table.ga_sessions_20161122`, UNNEST(hits) AS h
)
GROUP BY
visitId, source, medium, browser;
于 2016-11-24T20:06:57.117 に答える