关于如何在大查询中选择 event_params.key 的值的问题

Lil*_*ian 7 sql google-bigquery

我们的项目有一些事件记录用户在页面上停留的时间。我们添加一个名为time_ms的event_params.key,它的值显示了持续时间。如何选择“time_ms”的总和?

我尝试使用 SQL 语句但失败了。

SELECT *
FROM analytics_152426080.events_20190626
WHERE event_name = 'details_viewtime' AND
      event_params.key = 'time_ms'
Run Code Online (Sandbox Code Playgroud)

它显示错误消息:

'Cannot access field key on a value with type ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, ...>>> at [7:20]'.
Run Code Online (Sandbox Code Playgroud)

我希望得到'time_ms'的总和,但我应该先解决这个问题。

Gor*_*off 10

我认为你需要unnest

SELECT *
FROM analytics_152426080.events_20190626 e CROSS JOIN
     UNNEST(event_params) ep
WHERE e.event_name = 'details_viewtime' AND
      ep.key = 'time_ms';
Run Code Online (Sandbox Code Playgroud)

我不确定实际值的位置,但类似这样:

SELECT SUM(ep.value.int_value)
FROM analytics_152426080.events_20190626 e CROSS JOIN
     UNNEST(event_params) ep
WHERE ep.event_name = 'details_viewtime' AND
      ep.key = 'time_ms';
Run Code Online (Sandbox Code Playgroud)

假设您要求和的值是一个整数。

这假设值列是某种数字。否则,您需要将其转换为 1。

或者,如果您想对每行的值求和:

SELECT e.*,
       (SELECT SUM(ep.value.int_value)
        FROM UNNEST(event_params) ep
        WHERE ep.key = 'time_ms'
       ) as sum_ms
FROM analytics_152426080.events_20190626 e
WHERE e.event_name = 'details_viewtime'
Run Code Online (Sandbox Code Playgroud)