Выберите из большого запроса на основе более вложенных столбцов - PullRequest
0 голосов
/ 09 ноября 2018

Мне нужно отфильтровать больше вложенных данных в большом запросе, и я могу фильтровать только один запрос по одному.

В основном мне нужно это:

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

Возможна ли такая вещь?

У меня есть данные в большом запросе, как показано ниже, 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. Спасибо.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Ну, вы могли бы сделать:

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);
0 голосов
/ 09 ноября 2018

Все item_ids, где item_id не равен NULL, а page_id равен 23784

Ниже для BigQuery Standard 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            |
0 голосов
/ 09 ноября 2018

Попробуйте следующее:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...