BigQuery - 根据另一个事件参数选择事件参数值
Posted
技术标签:
【中文标题】BigQuery - 根据另一个事件参数选择事件参数值【英文标题】:BigQuery - Select event param value based on another event param 【发布时间】:2019-01-24 00:02:16 【问题描述】:在我的应用程序中,每当用户打开某个视图时,我都会向 Firebase 分析发送一个事件“content_view”。此事件有两个与之关联的事件参数:content_type 和 title。 content_type 始终是“音频”、“故事”、“视频”或“图像”,然后标题是不言自明的。
然后该数据进入 Big Query。
在 Big Query 中,我想按标题和事件数列出观看次数最多的 5 个视频。我可以按标题获得前 5 个事件,但我不知道如何仅对 content_type = 'video' 的事件执行此操作。
有没有办法构建一个返回类似内容的查询?
+---------+-------------+--------------+
| Title | Total Views | Content Type |
+---------+-------------+--------------+
| Video 1 | 1000 | video |
| Video 2 | 900 | video |
| Video 3 | 800 | video |
| Video 4 | 700 | video |
| Video 5 | 600 | video |
+---------+-------------+--------------+
【问题讨论】:
提示:WHERE content_type = 'video'
???
你能提供你的表的架构吗?
我添加了架构。问题是 firebase 在 event_params 字段中发送所有这些事件参数。所以 content_type 和 title 都是 event_params 中的键。我很确定我需要做某种类型的 UNNEST。然后我就迷路了。
【参考方案1】:
以下适用于 BigQuery 标准 SQL,基于您提供的(并经过测试)架构
#standardSQL
SELECT
(
SELECT MAX(IF(key = 'title', value.string_value, NULL)) title
FROM UNNEST(event_params) param
WHERE (key = 'content_type' AND value.string_value = 'video')
OR key = 'title'
HAVING COUNT(1) = 2
) Title,
COUNT(1) TotalViews
FROM `project.dataset.table`
GROUP BY Title
HAVING NOT title IS NULL
ORDER BY TotalViews DESC
LIMIT 5
【讨论】:
非常感谢。这正是我一直在寻找的。如果可能的话,你能解释一下“HAVING COUNT(1) = 2”在做什么吗? 当然,很快就会回来并添加一些解释:o) @user3321348 - 抱歉,这个行动项目丢失了,现在才想起我欠你一些解释 - 明天结束前会努力做到 - 今天太忙了HAVING COUNT(1) = 2
确保只选择那些同时具有 (2) 条件 `contenttype=video 并且有 key=type 条目的行。您可以删除此子句并查看结果将如何更改 :o)【参考方案2】:
修改以适合您的列名和项目/数据集/表名称的名称:
SELECT title, total_views, content_type
FROM `myproject.mydataset.mytable`
WHERE content_type = 'video'
【讨论】:
我用架构编辑了问题。 Firebase 正在发送这些事件,而 content_type 和 title 是 event_param 字段的一部分,我猜这是某种类型的数组。以上是关于BigQuery - 根据另一个事件参数选择事件参数值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Bigquery 中的另一个事件之前计算特定事件的数量?
在 Firebase (BigQuery) 中的一个/多个事件中获取多个参数的唯一计数