【问题标题】:Filtering query by two values in same ARRAY or STRUCTs in Firebase Analytics BigQuery database在 Firebase Analytics BigQuery 数据库中按相同 ARRAY 或 STRUCT 中的两个值过滤查询
【发布时间】:2020-12-31 03:23:11
【问题描述】:

这个问题是这个initial question的后续问题。

在前面的示例中,我们发现了如何从 Firebase 的 Analytics 数据库中过滤 STRUCT 数组。

现在是最重要的新挑战:

我的想法是,因为我们已经这样做了:

UNNEST(event_params) AS ep

这意味着 event_params 现在被展平了,这意味着它的值来自以下 ARRAYS:

  • value.string_value:可以访问值;
  • value.int_value:可以访问值;
  • 等等..

所以我的想法是,因为我设法访问了 value.string_value = 'Restaurant profile',所以访问示例中名为“restaurant_id”的其他值应该没问题,所以我添加了更多 AND声明:

  ep.key = 'restaurant_id' AND
  ep.value.int_value = 2045881 AND

但是正如你可以想象的那样,因为我发布了它,结果并不完全是预期的????????????即使从技术上讲 BigQuery 确实接受了我的解决方案:

知道我的初始查询出了什么问题以及如何解决吗?

【问题讨论】:

    标签: sql google-analytics google-bigquery firebase-analytics


    【解决方案1】:

    知道我的初始查询出了什么问题以及如何解决吗?

    问题是ep.key 不能同时是firebase_screenrestaurant_id - 所以你需要使用OR 而不是使用AND,如下例所示

    SELECT *
    FROM `diningcity-2ad82.analytics_171798853.events_20201222` e, UNNEST(e.event_params) ep 
    WHERE e.platform = 'IOS' AND (
        (ep.key = 'firebase_screen' AND ep.value.string_value = 'Restaurant profile') OR 
        (ep.key = 'restaurant_id' AND ep.value.int_value = 2045881)
      )
    LIMIT 1000;     
    

    但是如果我需要这两个条件都成立呢? ...

    我认为在这种情况下,您的初始查询不是最好的开始 - 请改用下面的方法

    SELECT *
    FROM `diningcity-2ad82.analytics_171798853.events_20201222` e
    WHERE e.platform = 'IOS' AND (
      SELECT COUNT(*)
      FROM e.event_params 
      WHERE
        (key = 'firebase_screen' AND value.string_value = 'Restaurant profile') OR 
        (key = 'restaurant_id' AND value.int_value = 2045881)
      ) = 2
    LIMIT 1000;
    

    【讨论】:

    • 但是如果我需要同时满足这两个条件怎么办?如果我使用OR,那么这意味着这个参数称为restaurant_id,它在“餐厅简介”之外的其他屏幕中使用也会被返回,这是错误的
    【解决方案2】:

    你可以使用exists如下:

    SELECT *
    FROM `diningcity-2ad82.analytics_171798853.events_20201222` e, 
          UNNEST(e.event_params) ep 
    WHERE e.platform = 'IOS' 
      AND ep.key = 'firebase_screen'
      AND ep.value.string_value = 'Restaurant profile'
      And exists (select 1 from UNNEST(e.event_params) epp
                   Where epp.key = 'restaurant_id' 
                     AND epp.value.int_value = 2045881)
    LIMIT 1000;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-25
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 2015-10-20
      • 2020-10-27
      相关资源
      最近更新 更多