【问题标题】:Select from bigquery based on more nested columns从基于更多嵌套列的 bigquery 中选择
【发布时间】:2018-11-09 13:11:36
【问题描述】:

我需要在 bigquery 中按更多嵌套数据进行过滤,而我的查询只能按一个过滤。

基本上我需要这个:

SELECT item_id FROM table WHERE item_id IS NOT NULL AND page_id = '23784'

这样的事情可能吗?

我在 bigquery 中有如下数据,page_id 不必存在:

| row | date | event      | params.key    | params.value |
-------------------------------------------------------
| 1   | 2018 | screenShow | item_id       | 1            |
                          | page_id       | 23784        |
                          | irrelevant_id | 5            |
| 2   | 2018 | screenShow | item_id       | 2            |
                          | irrelevant_id | 7            |

我的查询是:

SELECT param.value
FROM `table`,
UNNEST(params) AS param
WHERE
    event = 'screenShow'
    AND param.key = 'item_id'

但这显然只适用于一个键,我不知道如何添加 page_id 部分。 谢谢。

【问题讨论】:

  • 你想退回什么?
  • 所有 item_id,其中 item_id 不为空且 page_id 为 23784

标签: sql google-bigquery


【解决方案1】:

item_id 不为 null 且 page_id 为 23784 的所有 item_id

以下是 BigQuery 标准 SQL

#standardSQL
SELECT 
  (SELECT value FROM UNNEST(params) param WHERE key = 'item_id') item_id
FROM `project.dataset.table`
WHERE (
  SELECT COUNT(1) 
  FROM UNNEST(params) param 
  WHERE param = ('page_id', 23784)
  OR key = 'item_id'
  ) = 2  

您可以使用下面的虚拟数据进行测试,使用上面的内容

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 2018 dt, 'screenShow' event, 
    [STRUCT<key STRING, value INT64>('item_id', 1), ('page_id', 23784), ('irrelevant_id', 5)] params UNION ALL
  SELECT 2018 dt, 'screenShow' event, 
    [STRUCT<key STRING, value INT64>('item_id', 2), ('irrelevant_id', 7)] params UNION ALL
  SELECT 2018 dt, 'screenShow' event, 
    [STRUCT<key STRING, value INT64>('item_id2', 1), ('page_id', 23784), ('irrelevant_id', 5)] params 
)
SELECT 
  (SELECT value FROM UNNEST(params) param WHERE key = 'item_id') item_id
FROM `project.dataset.table`
WHERE (
  SELECT COUNT(1) 
  FROM UNNEST(params) param 
  WHERE param = ('page_id', 23784)
  OR key = 'item_id'
  ) = 2

结果

Row item_id  
1   1       

显然,如果只是 item_id 的列表,您需要整行 - 您只需使用 SELECT *,如下所示

#standardSQL
SELECT *
FROM `project.dataset.table`
WHERE (
  SELECT COUNT(1) 
  FROM UNNEST(params) param 
  WHERE param = ('page_id', 23784)
  OR key = 'item_id'
  ) = 2  

在这种情况下你会得到

| row | date | event      | params.key    | params.value |
-------------------------------------------------------
| 1   | 2018 | screenShow | item_id       | 1            |
                          | page_id       | 23784        |
                          | irrelevant_id | 5            |

【讨论】:

    【解决方案2】:

    尝试以下方法:

    SELECT
      (SELECT x.value FROM UNNEST(params) AS x WHERE x.key = 'item_id') AS item_id
    FROM
      `your_dataset.your_table`
    WHERE
      EXISTS (
      SELECT
        *
      FROM
        UNNEST(params) AS x
      JOIN
        UNNEST (params) AS y
      WHERE
        x.key = 'item_id'
        AND x.value IS NOT NULL
        AND y.key = 'page_id'
        AND y.value=23784)
    

    【讨论】:

      【解决方案3】:

      好吧,你可以这样做:

      select t.*
      from t
      where exists (select 1 from unnest(params) p where p.key = 'item_id' and p.value is not null) and
            exists (select 1 from unnest(params) p where p.key = 'page_id' and p.value = 23784);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-15
        • 1970-01-01
        相关资源
        最近更新 更多