BigQuery Filter Rows by Array Entry - PullRequest
       0

BigQuery Filter Rows by Array Entry

0 голосов
/ 23 сентября 2019

Мне нужно создать столбцы, полученные из значений массива в записи.В следующей таблице примеров есть 4 записи, которые называются «сессиями», и у каждой сессии есть несколько посещенных значений приложения (onlineshop или nativeapp).В производном столбце я хочу иметь значение «1», если в этом сеансе есть хотя бы одна запись «nativeapp».Во втором столбце мне нужно иметь «1», если все записи «nativeapp».Иначе значение должно быть «0».

WITH TESTTABLE AS (
  SELECT 'session A' AS session, SPLIT("onlineshop,onlineshop") AS application, 8 AS point UNION ALL
  SELECT 'session B' AS session, SPLIT("onlineshop,nativeapp") AS application, 9 AS point UNION ALL
  SELECT 'session C' AS session, SPLIT("onlineshop,nativeapp") AS application, 5 AS point UNION ALL
  SELECT 'session D' AS session, SPLIT("nativeapp") AS application, 4 AS point
) 

Моя попытка состояла в том, чтобы сделать подзапрос «select ...», который фильтрует записи ... однако мне нужно было бы иметь ссылку на подзапрос.к его записи, но на самом деле это только «1», если любая запись во всей таблице соответствует подзапросу.

SELECT *, (SELECT MAX(IF(appEntry LIKE "%nativeapp%", 1, 0 )) FROM TESTTABLE, UNNEST(application) as appEntry) as isNativeSession FROM TESTTABLE 

Таким образом, результат должен быть:

enter image description here

1 Ответ

1 голос
/ 23 сентября 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *, 
  (SELECT SIGN(COUNT(1)) FROM UNNEST(application) value WHERE value = 'nativeapp') AS isNativeSession,
  (SELECT CAST(STRING_AGG(DISTINCT value) = 'nativeapp' AS INT64) FROM UNNEST(application) value) AS isNativeOnlySession 
FROM TESTTABLE  

с результатом

enter image description here

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