Sql 查询“记录”中的特定值
我最近一直在尝试直接查询我们的Firebase Analytics数据,因为Firebase仪表板只有一些非常基本的数据查看功能 看起来我们可以直接在BigQuery中查询数据,但是BigQuery使用的数据库类型似乎是基于列的存储,并且与MySQL等传统数据库的数据类型不同 因此,我完成了以下任务: 我尝试阅读了一些关于BigQuery官方文档的文档,例如: 但它似乎是关于数组的,我不太理解文档,在BigQuery仪表板中,它说这些列实际上不是数组,它们是记录类型: 。。我也没有在网上找到太多的信息 既然我真的不知道该怎么做,那就继续质疑吧,我只是尝试了一些可能会让你们觉得很愚蠢的东西哈哈哈:Sql 查询“记录”中的特定值,sql,google-analytics,google-bigquery,firebase-analytics,Sql,Google Analytics,Google Bigquery,Firebase Analytics,我最近一直在尝试直接查询我们的Firebase Analytics数据,因为Firebase仪表板只有一些非常基本的数据查看功能 看起来我们可以直接在BigQuery中查询数据,但是BigQuery使用的数据库类型似乎是基于列的存储,并且与MySQL等传统数据库的数据类型不同 因此,我完成了以下任务: 我尝试阅读了一些关于BigQuery官方文档的文档,例如: 但它似乎是关于数组的,我不太理解文档,在BigQuery仪表板中,它说这些列实际上不是数组,它们是记录类型: 。。我也没有在网上找到太多
SELECT *
FROM `diningcity-2ad82.analytics_171798853.events_20201222`
WHERE event_params.string_value.screen_name = "Deal details"
LIMIT 1000;
所以我试着用这个。作为告诉BigQuery的一种方法,首先转到事件参数,然后在内部转到字符串值,然后转到屏幕名称,检查最终值
但是BigQuery不喜欢它:
Cannot access field string_value on a value with type ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, ...>>> at [3:20]
那么,有人能帮我找出我做错了什么,正确的方法是什么
作为参考,我也尝试过阅读本教程,但也没有真正理解我试图重新创建您在下面查询的WITH子句中拥有的数据。为了访问重复的数组元素,您必须访问它们: 事件参数字段实际上是一个结构数组。它是RECORD类型,其模式是重复的,这是来自遗留SQL的名称,它等于结构数组。您可以找到标准SQL和旧SQL数据类型的比较
您可以在文档中看到一些查询嵌套字段的示例。BigQuery表格格式的意思是: event_params是一个结构数组-这就是重复的含义。 值是该结构中的结构。 字符串值是该数组中的字符串字段。 我不知道为什么BigQuery在表描述中使用record,而在文档的其他地方使用struct 要访问阵列,请使用unnest。一种方法是FROM子句。正如您对查询的措辞一样,这将是:
SELECT *
FROM `diningcity-2ad82.analytics_171798853.events_20201222` e CROSS JOIN
UNNEST(e.event_params) ep
WHERE v.screen_name = 'Deal details'
LIMIT 1000;
唯一的问题是screen_name可能是键值,而不是列/字段名。所以,你真的想要:
SELECT *
FROM `diningcity-2ad82.analytics_171798853.events_20201222` e CROSS JOIN
UNNEST(e.event_params) ep
WHERE ep.key = 'screen_name' AND
ep.value.string_value = 'Deal details'
LIMIT 1000;
如果不需要结果集中的所有参数,可以使用:
SELECT * EXCEPT (event_params)
也可以在子查询中执行此操作:
SELECT *
FROM `diningcity-2ad82.analytics_171798853.events_20201222` e
WHERE EXISTS (SELECT 1
FROM UNNEST(e.event_params) ep
WHERE ep.key = 'screen_name' AND
ep.value.string_value = 'Deal details'
LIMIT 1000;
如果您不想在一行可能有多个匹配项的情况下增加行数,这将非常方便。我使用WITH子句来模拟您在diningcity-2ad82.analytics_171798853.events_20201222中拥有的数据,仅作为如何查询数据的示例。您不必使用WITH子句,而是使用diningcity-2ad82.analytics_171798853.events_20201222代替FROM子句中的数据,这样您就可以访问查询表中的所有列。重要的部分是使用UNNESTdata.event_参数,该参数在您的案例中应该类似。如果无法理解,请告诉我,这样我可以提供一个我尝试过的更好的答案:选择*来自diningcity-2ad82.analytics_171798853.events_20201222,UnestEvent_params,其中event_params.string_value.screen_name=交易详情限制1000;仍然得到相同的错误,我没有得到它请:选择*从diningcity-2ad82.analytics_171798853.events_20201222作为e,unneste.event_参数作为ep,其中ep.key='screen_name'和ep.value.string_value='Deal details';哦,真管用!太棒了,谢谢!我也不明白我在做什么,我不明白为什么我需要这个?我想通过select*选择所有列,然后使用WHERHI进行筛选,所以我检查了你的答案,让我困惑的是,Kyrylo在BigQuery中的答案与你的答案非常相似,但有一个关键区别:select*from diningcity-2ad82.analytics_171798853.events_20201222 as e,unneste.event_参数作为ep,其中ep.key='screen_name'和ep.value.string_value='Deal details';在您的解决方案中,您还交叉连接ep.value,而不是仅连接event_params,请问有什么区别?有吗?实际上,如果我尝试您的第二个代码段,我会在BigQuery编辑器中的交叉连接unnestp.value AS v part上得到一个错误:UNNEST中引用的值必须是数组。UNNEST在[2:124]处包含STRUCT类型的表达式。似乎ep.value部分不能被取消,或者根据数据的定义,value是记录数组中的字符串数组。BigQuery似乎与您的观点不一致@FlorianMonfort。我误读了数据结构,并适当地更新了答案。
SELECT *
FROM `diningcity-2ad82.analytics_171798853.events_20201222` e
WHERE EXISTS (SELECT 1
FROM UNNEST(e.event_params) ep
WHERE ep.key = 'screen_name' AND
ep.value.string_value = 'Deal details'
LIMIT 1000;