BigQuery - Найти данные, которые существуют для всех записей - PullRequest
0 голосов
/ 08 мая 2018

Я импортировал Firebase в BigQuery.

Что я хочу сделать, так это найти конкретные устройства (запись взаимодействия с firebase), которые ВСЕГДА выполняют какое-то событие. Это означает, что всякий раз, когда эти устройства записываются в firebase, event_dim.name будет содержать как минимум одну запись этого типа события.

Например, рассмотрим следующий запрос с примерами данных из ( Ссылка ):

#standardSQL
SELECT 
  user_dim.app_info.app_instance_id,
  event_dim
FROM `firebase-analytics-sample-data.ios_dataset.app_events_20160607`

Предположим, что есть такие данные, как

+------------------+--------------------+
| app_instance_id  | event_dim.name     |
+------------------+--------------------+
| 1234             | os_update          |
|                  | initialized_rh_api |
+------------------+--------------------+
| 1234             | os_update          |
+------------------+--------------------+
| 5678             | os_update          |
|                  | initialized_rh_api |
+------------------+--------------------+
| 5678             | other_action       |
+------------------+--------------------+

Я хочу сделать запрос, чтобы получить список отдельных «app_instance_id», где их event_dim.name содержит «os_update». Исходя из этого критерия, для элементов, указанных выше, 1234 будет соответствовать, а 5678 - нет.

Спасибо. Возможно, это действительно просто, но я не могу найти способ. Я могу найти каждую запись, которая содержит запись, но не может удалить записи, у которых ее нет.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Я бы использовал агрегацию:

SELECT user_dim.app_info.app_instance_id    FROM `firebase-analytics-sample-data.ios_dataset.app_events_20160607`
GROUP BY user_dim.app_info.app_instance_id
HAVING SUM(CASE WHEN event_dim.name NOT LIKE '%os_update%' THEN 1 ELSE 0 END) = 0;

Предложение HAVING подсчитывает количество событий, которые не совпадают. = 0 говорит, что их нет.

0 голосов
/ 08 мая 2018

Ниже для стандартного SQL BigQuery и возвращает все имена, которые появляются во всех app_instances

#standardSQL
SELECT app_instance_id, name
FROM (
  SELECT app_instance_id, COUNT(1) cnt,
    ARRAY_CONCAT_AGG(names) names
  FROM (
    SELECT user_dim.app_info.app_instance_id, 
      ARRAY(SELECT DISTINCT name FROM UNNEST(event_dim) dim) names   
    FROM `project.dataset.your_table`
  )
  GROUP BY app_instance_id
), UNNEST(names) name
GROUP BY app_instance_id, name
HAVING COUNT(1) = ANY_VALUE(cnt) 

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

#standardSQL
WITH `project.dataset.your_table` AS (
  SELECT STRUCT<app_info STRUCT<app_instance_id STRING>>(STRUCT('1234')) user_dim, [STRUCT<name STRING>('os_update'), STRUCT('initialized_rh_api')] event_dim UNION ALL
  SELECT STRUCT(STRUCT('1234')) user_dim, [STRUCT<name STRING>('os_update')] event_dim UNION ALL
  SELECT STRUCT(STRUCT('5678')) user_dim, [STRUCT<name STRING>('os_update'), STRUCT('initialized_rh_api')] event_dim UNION ALL
  SELECT STRUCT(STRUCT('5678')) user_dim, [STRUCT<name STRING>('other_action')] event_dim 
)
SELECT app_instance_id, name
FROM (
  SELECT app_instance_id, COUNT(1) cnt,
    ARRAY_CONCAT_AGG(names) names
  FROM (
    SELECT user_dim.app_info.app_instance_id, 
      ARRAY(SELECT DISTINCT name FROM UNNEST(event_dim) dim) names   
    FROM `project.dataset.your_table`
  )
  GROUP BY app_instance_id
), UNNEST(names) name
GROUP BY app_instance_id, name
HAVING COUNT(1) = ANY_VALUE(cnt)  

Вы получите желаемый результат

Row app_instance_id name     
1   1234            os_update    
0 голосов
/ 08 мая 2018

Я использую регулярное выражение и самостоятельное соединение в базе данных Oracle. Пожалуйста, проверьте приведенный ниже пример.


    CREATE TABLE EVENTS (app_instance_id NUMBER, event_dim_name VARCHAR2(100));
    --- Sample record
    INSERT INTO EVENTS VALUES(1234,'os_update initialized_rh_api');
    INSERT INTO EVENTS VALUES(1234,'os_update');
    INSERT INTO EVENTS VALUES(5678,'os_update initialized_rh_api');
    INSERT INTO EVENTS VALUES(5678,'other_action');
    INSERT INTO EVENTS VALUES(7895,'os_update initialized_rh_api');
    INSERT INTO EVENTS VALUES(7895,'os_update');
    INSERT INTO EVENTS VALUES(4567,'os_update initialized_rh_api');
    INSERT INTO EVENTS VALUES(4567,'other_action');

    -- Sample Query

    SELECT EV.APP_INSTANCE_ID,
      EV.EVENT_DIM_NAME
    FROM
      (SELECT DISTINCT app_instance_id,
        regexp_substr(event_dim_name,'^[os_update]+', 1, level) AS"event_dim_name"
      FROM EVENTS
        CONNECT BY regexp_substr(event_dim_name, '^[os_update]+', 1, level) IS NOT NULL
      )TEMP,
      EVENTS EV
        WHERE EV.APP_INSTANCE_ID = TEMP.app_instance_id
        AND EV.EVENT_DIM_NAME    = TEMP."event_dim_name";

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...