Sql 查询“记录”中的特定值

Sql 查询“记录”中的特定值,sql,google-analytics,google-bigquery,firebase-analytics,Sql,Google Analytics,Google Bigquery,Firebase Analytics,我最近一直在尝试直接查询我们的Firebase Analytics数据,因为Firebase仪表板只有一些非常基本的数据查看功能 看起来我们可以直接在BigQuery中查询数据,但是BigQuery使用的数据库类型似乎是基于列的存储,并且与MySQL等传统数据库的数据类型不同 因此,我完成了以下任务: 我尝试阅读了一些关于BigQuery官方文档的文档,例如: 但它似乎是关于数组的,我不太理解文档,在BigQuery仪表板中,它说这些列实际上不是数组,它们是记录类型: 。。我也没有在网上找到太多

我最近一直在尝试直接查询我们的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;