Как посчитать частоту слов из столбца таблицы Google SQL Bigquery - PullRequest
0 голосов
/ 07 мая 2020

У меня есть столбец из таблицы, в котором, например, есть определенные слова.

MyTable

 Name    device_Used
-----  ----------------  
 a       iphone, Ipad, laptop
 b       mobile, laptop, android, desktop
 c       android, desktop, washing machine

Теперь я хочу найти набор слов, например, [Ipad, android, ноутбук] из этой таблицы и посчитайте его частоту.

Я попытался сделать это, прочитав какое-то онлайн-решение и создав свое собственное, но получил ошибки. Это то, что я пробовал.

WITH words AS (
  SELECT word
  FROM UNNEST([Ipad,android,laptop,desktop]) word
),
listcolumn AS (
  SELECT device
  FROM UNNEST(MyTable.device_Used) device
)
SELECT device, COUNT(word) AS cnt
FROM listcolumn
JOIN words
ON (device <> "")
GROUP BY device
ORDER BY cnt DESC;

Я хочу создать новый результат таблицы, например: -

   device_Used      count
---------------   -----------
Ipad                1            
android             2
laptop              2
desktop             2

Поскольку я новичок в этом, вы можете предложить новый код поскольку тот, который я использую, можно изменить, прочитав онлайн-предложения.

1 Ответ

1 голос
/ 07 мая 2020

Ниже приведено для BigQuery Standard SQL

#standardSQL
SELECT TRIM(LOWER(device_Used)) AS device_Used, COUNT(1) `count`
FROM `project.dataset.table`,
UNNEST(SPLIT(device_Used)) device_Used
GROUP BY device_Used
HAVING LOWER(device_Used) IN ('ipad','android','laptop')

Если применить к образцу данных в вашем вопросе, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'a' Name, 'iphone, Ipad, laptop' device_Used UNION ALL
  SELECT 'b', 'mobile, laptop, android, desktop' UNION ALL
  SELECT 'c', 'android, desktop, washing machine' 
)
SELECT TRIM(LOWER(device_Used)) AS device_Used, COUNT(1) `count`
FROM `project.dataset.table`,
UNNEST(SPLIT(device_Used)) device_Used
GROUP BY device_Used
HAVING LOWER(device_Used) IN ('ipad','android','laptop')

, результат будет

Row device_Used count    
1   ipad        1    
2   laptop      2    
3   android     2     

если вы можете прокомментировать, какая строка делает то, что она будет очень полезна

SELECT TRIM(LOWER(device_Used)) AS device_Used, COUNT(1) `count` -- (4) 
FROM `project.dataset.table`, -- (1)
UNNEST(SPLIT(device_Used)) device_Used -- (2)  
GROUP BY device_Used -- (3) 
HAVING LOWER(device_Used) IN ('ipad','android','laptop') -- (5)    
  1. выбрать из таблицы
  2. преобразовать список, разделенный запятыми, в массив и разложите его
  3. сгруппируйте по элементам невложенного массива
  4. удалите конечные пробелы и нижний регистр для учета чувствительности к регистру
  5. просто оставляет на выходе эти устройства в предопределенном списке
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...